Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ms-access/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 选择一个或多个关系中的最后一条记录_Sql_Ms Access_Select_Join_Indexing - Fatal编程技术网

Sql 选择一个或多个关系中的最后一条记录

Sql 选择一个或多个关系中的最后一条记录,sql,ms-access,select,join,indexing,Sql,Ms Access,Select,Join,Indexing,我在格式化查询以返回一组人员时遇到问题,同时从另一个表(如果可用)加入他们的最新记录 我已经看过了很多关于SO的例子,但是找不到一个适合我要求的MS Access 2007的例子 模式如下: dbo_ds_员工 dbo团队成员 dbo小组组长 ct\U pm\U诊断 ct\U pm\U结果 我想在查询中返回员工id、名字、姓氏和结果(如果可用) 我尝试了以下方法,但它会返回团队的所有记录,而不仅仅是最新的诊断: SELECT s.id, s.first_name, s.last_name, o.

我在格式化查询以返回一组人员时遇到问题,同时从另一个表(如果可用)加入他们的最新记录

我已经看过了很多关于SO的例子,但是找不到一个适合我要求的MS Access 2007的例子

模式如下:

dbo_ds_员工

dbo团队成员

dbo小组组长

ct\U pm\U诊断

ct\U pm\U结果

我想在查询中返回员工id、名字、姓氏和结果(如果可用)

我尝试了以下方法,但它会返回团队的所有记录,而不仅仅是最新的诊断:

SELECT s.id, s.first_name, s.last_name, o.Outcome 
    FROM ((SELECT s.id, s.first_name, s.last_name 
        FROM ((dbo_ds_staff AS s 
            INNER JOIN dbo_ds_team_staff_member AS tsm ON s.id=tsm.staff_id) 
            INNER JOIN dbo_ds_team_leader AS tl ON tsm.team_id=tl.team_id) 
            WHERE tl.staff_id = 26928 And tsm.start_date < Now() And (tsm.end_date >= Now() Or tsm.end_date Is Null) And tl.start_date < Now() And (tl.end_date >= Now() Or tl.end_date Is Null) 
            GROUP BY s.id, s.first_name, s.last_name) as s 
    LEFT JOIN ct_pm_Diagnostic AS d ON s.id=d.StaffId) 
    LEFT JOIN ct_pm_Outcome AS o ON d.OutcomeId = o.OutcomeId 
    ORDER BY s.first_name, s.last_name

是否有人可以帮助您仅根据ct\U pm\U诊断表中添加的字段返回最新的诊断结果?我的研究表明,我需要在添加时使用MAX函数以及另一组条件,但我很难想出如何使用它们。

第一步是从Diagnostic每位员工处获取最后添加的日期:

SELECT  d.StaffID, MAX(Added) AS MaxAdded
FROM    ct_pm_Diagnostic
GROUP BY d.StaffID;
SELECT  d.*
FROM    ct_pm_Diagnostic AS d
        INNER JOIN
        (   SELECT  d.StaffID, MAX(Added) AS Added
            FROM    ct_pm_Diagnostic
            GROUP BY d.StaffID
        ) AS MaxD
            ON MaxD.StaffID = d.StaffID
            AND MaxD.Added = d.Added;
然后,您需要将此查询的结果连接回ct_pm_Diagnostic,以仅过滤每个工作人员的最新记录:

SELECT  d.StaffID, MAX(Added) AS MaxAdded
FROM    ct_pm_Diagnostic
GROUP BY d.StaffID;
SELECT  d.*
FROM    ct_pm_Diagnostic AS d
        INNER JOIN
        (   SELECT  d.StaffID, MAX(Added) AS Added
            FROM    ct_pm_Diagnostic
            GROUP BY d.StaffID
        ) AS MaxD
            ON MaxD.StaffID = d.StaffID
            AND MaxD.Added = d.Added;
我认为您可以将其添加回原始查询,如下未测试:

SELECT s.id, s.first_name, s.last_name, o.Outcome 
    FROM ((SELECT s.id, s.first_name, s.last_name 
        FROM ((dbo_ds_staff AS s 
            INNER JOIN dbo_ds_team_staff_member AS tsm ON s.id=tsm.staff_id) 
            INNER JOIN dbo_ds_team_leader AS tl ON tsm.team_id=tl.team_id) 
            WHERE tl.staff_id = 26928 And tsm.start_date < Now() And (tsm.end_date >= Now() Or tsm.end_date Is Null) And tl.start_date < Now() And (tl.end_date >= Now() Or tl.end_date Is Null) 
            GROUP BY s.id, s.first_name, s.last_name) as s 
    LEFT JOIN (ct_pm_Diagnostic AS d 
        INNER JOIN (SELECT d.StaffID, MAX(Added) AS Added
                    FROM ct_pm_Diagnostic
                    GROUP BY d.StaffID) AS MaxD 
            ON MaxD.StaffID = d.StaffID AND MaxD.Added = d.Added)
        ON s.id=d.StaffId) 
    LEFT JOIN ct_pm_Outcome AS o ON d.OutcomeId = o.OutcomeId 
    ORDER BY s.first_name, s.last_name

就像LatestDiagnostic一样,您可以在原始查询中将ct\U pm\U Diagnostic替换为LatestDiagnostic。

谢谢您的回答-我现在理解了这个理论。不幸的是,我仍然收到一个连接表达式不受支持的错误,没有显示错误的位置。这非常感谢,编辑的版本进行了一些调整。真的很感谢你的时间!我在另一个查询中使用了这个方法,该查询有三个过滤器,用于从多个表中获取最新记录。最佳做法是保存每个查询并在“主”查询中引用它们,还是将它们全部放在一个查询中?谢天谢地,我无法告诉您Access中的最佳实践。我知道它不能很好地处理复杂的查询,所以将它们保存为一个单独的查询可能会有所帮助,但我要说的是,做你认为最容易维护的事情。谢谢,我选择了单独存储查询,因为它似乎更容易处理逻辑。我知道你在说什么访问和复杂查询,没用!
SELECT  d.StaffID, MAX(Added) AS MaxAdded
FROM    ct_pm_Diagnostic
GROUP BY d.StaffID;
SELECT  d.*
FROM    ct_pm_Diagnostic AS d
        INNER JOIN
        (   SELECT  d.StaffID, MAX(Added) AS Added
            FROM    ct_pm_Diagnostic
            GROUP BY d.StaffID
        ) AS MaxD
            ON MaxD.StaffID = d.StaffID
            AND MaxD.Added = d.Added;
SELECT s.id, s.first_name, s.last_name, o.Outcome 
    FROM ((SELECT s.id, s.first_name, s.last_name 
        FROM ((dbo_ds_staff AS s 
            INNER JOIN dbo_ds_team_staff_member AS tsm ON s.id=tsm.staff_id) 
            INNER JOIN dbo_ds_team_leader AS tl ON tsm.team_id=tl.team_id) 
            WHERE tl.staff_id = 26928 And tsm.start_date < Now() And (tsm.end_date >= Now() Or tsm.end_date Is Null) And tl.start_date < Now() And (tl.end_date >= Now() Or tl.end_date Is Null) 
            GROUP BY s.id, s.first_name, s.last_name) as s 
    LEFT JOIN (ct_pm_Diagnostic AS d 
        INNER JOIN (SELECT d.StaffID, MAX(Added) AS Added
                    FROM ct_pm_Diagnostic
                    GROUP BY d.StaffID) AS MaxD 
            ON MaxD.StaffID = d.StaffID AND MaxD.Added = d.Added)
        ON s.id=d.StaffId) 
    LEFT JOIN ct_pm_Outcome AS o ON d.OutcomeId = o.OutcomeId 
    ORDER BY s.first_name, s.last_name
SELECT s.id, s.first_name, s.last_name, o.Outcome 
    FROM ((SELECT s.id, s.first_name, s.last_name 
        FROM ((dbo_ds_staff AS s 
            INNER JOIN dbo_ds_team_staff_member AS tsm ON s.id=tsm.staff_id) 
            INNER JOIN dbo_ds_team_leader AS tl ON tsm.team_id=tl.team_id) 
            WHERE tl.staff_id = 26928 And tsm.start_date < Now() And (tsm.end_date >= Now() Or tsm.end_date Is Null) And tl.start_date < Now() And (tl.end_date >= Now() Or tl.end_date Is Null) 
            GROUP BY s.id, s.first_name, s.last_name) as s 
    LEFT JOIN (SELECT d.*
                FROM ct_pm_Diagnostic AS d
                    INNER JOIN
                    (   SELECT  d.StaffID, MAX(Added) AS Added
                        FROM    ct_pm_Diagnostic
                        GROUP BY d.StaffID
                    ) AS MaxD
                        ON MaxD.StaffID = d.StaffID
                        AND MaxD.Added = d.Added) AS d
        ON s.id=d.StaffId) 
    LEFT JOIN ct_pm_Outcome AS o ON d.OutcomeId = o.OutcomeId 
    ORDER BY s.first_name, s.last_name
SELECT  d.*
FROM    ct_pm_Diagnostic AS d
        INNER JOIN
        (   SELECT  d.StaffID, MAX(Added) AS Added
            FROM    ct_pm_Diagnostic
            GROUP BY d.StaffID
        ) AS MaxD
            ON MaxD.StaffID = d.StaffID
            AND MaxD.Added = d.Added;