【发布时间】:2019-04-18 15:43:01
【问题描述】:
尝试在 Access 2016 中选择所有学生,并为每个学生加入一个计划。它工作正常,但它不是选择的最新计划...... 如果我只为特定的 student_id 运行子查询,它正在工作并且选择了最近的计划。
SELECT dbo_Student.*, a.*
FROM dbo_Student LEFT JOIN (SELECT TOP 1 * FROM dbo_Plan ORDER BY Year
DESC, Version DESC) AS a ON dbo_Student.ID = a.student_id
WHERE Archived = FALSE
ORDER BY Name;
编辑
多亏了 C perkins,这是迄今为止我得到的最接近的结果:
SELECT s.*, p.*
FROM dbo_Student s LEFT JOIN
(SELECT p1.*
FROM dbo_Plan p1 INNER JOIN
(SELECT p2.student_id, MAX(p2.ID) As MaxID
FROM dbo_Plan p2
GROUP BY p2.student_id
) pAgg
ON p1.student_id = pAgg.student_id
AND p1.ID = pAgg.MaxID
) p
ON s.id = p.student_id
WHERE Archived = FALSE
ORDER BY Name;
这假定最大 ID 是最新的计划(年份 DESC,版本 DESC)。它几乎总是有效,但它不是故障安全的。
【问题讨论】:
-
你尝试过使用“内部”连接吗?
-
您的子查询总共只返回一条记录。您想要一个返回一条记录的每个学生。
-
@ErayBalkanli 是的,但是有些学生没有计划。