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