SQL (MS ACCESS) 基于最大值连接表
Posted
技术标签:
【中文标题】SQL (MS ACCESS) 基于最大值连接表【英文标题】:SQL (MS ACCESS) Joining tables based on a maximum value 【发布时间】:2018-10-06 13:54:44 【问题描述】:我正在尝试加入 MS ACCESS 中的表。 有问题的表是 PatientDB 和 DailyAssessment。
PatientDB 表包含主键 Patient_UID。
DailyAssessment 表包含主键 Assessment_UID。 它还包含一个 Patient_UID 字段,该字段链接到数据库关系中的 PatientDB。
我想要实现的是:
从 PatientDB 表中选择所有符合条件的记录:Patient_Active = TRUE。
对于每条活动记录,我想检索 DailyAssessments 表中的最新条目。 到目前为止,我已经尝试通过使用来实现这一点:
Max(Assessment_UID) As MaxOfAssessment_UID
然后使用此值尝试加入一个查询,该查询返回 DailyAssessment 表中的其他值。
SQL 如下所示:
SELECT PatientDB.Patient_UID,
Max(DailyAssessment.Assessment_UID) AS
MaxOfAssessment_UID,
qryAssessmentData.Assessment_Date,
qryAssessmentData.Assessment_Time,
qryAssessmentData.Rescue_Analgesia, qryAssessmentData.
[Review By], qryAssessmentData.Assessment_Grade,
qryAssessmentData.Assessment_Notes
FROM (PatientDB INNER JOIN DailyAssessment ON
PatientDB.Patient_UID = DailyAssessment.Patient_UID)
INNER JOIN qryAssessmentData ON MaxOfAssessment_UID =
qryAssessmentData.Assessment_UID
GROUP BY PatientDB.Patient_UID,
qryAssessmentData.Assessment_Date,
qryAssessmentData.Assessment_Time,
qryAssessmentData.Rescue_Analgesia, qryAssessmentData.
[Review By], qryAssessmentData.Assessment_Grade,
qryAssessmentData.Assessment_Notes;
但是我得到一个 JOIN expression not supported 错误,它突出显示:'JOIN qryAssessmentData ON MaxOfAssessment_UID = qryAssessmentData.Assessment_UID'。
有没有人知道如何实现这一点 - 更简单的方法还是我做错了什么?我对 SQL 有相当基本的了解,因此欢迎提出任何建议!
非常感谢。
【问题讨论】:
您说您有两个表,但您的查询引用了三个。 看起来不错,但我可以看到其中有一些语法错误。例如,我不认为 (FROM 周围的括号是必要的。其次,根据你的问题的描述,我认为你不想 GROUP BY 超过 UID 和日期,因为它会给你这些的外部产品列。 只有两个表,但提到的第三件事 (qryAssessmentData) 是一个单独的查询,它只返回 DailyAssessment 表中的所有数据字段。我这样做是为了尝试减少原始 SQL 的长度。 【参考方案1】:您不能再次使用列别名 -- 不能在 SELECT
、WHERE
或 ON
中使用(好吧,您可以在 ORDER BY
中使用)。
无论如何你都不想聚合。你只是想要过滤。
如果我理解正确,你想要这样的东西:
SELECT . . .
FROM PatientDB as p INNER JOIN
DailyAssessment as da
ON p.Patient_UID = da.Patient_UID
WHERE da.Assessment_UID = (SELECT MAX(da2.Assessment_UID)
FROM DailyAssessment da2
WHERE da2.Patient_UID = da.Patient_UID
);
注意事项:
您的问题没有说明第三张表的用途。 您的问题没有说明如何确定患者是否处于活动状态。 这引入了表别名,因此您的查询更易于编写和阅读。【讨论】:
和上面第三张表一样,qryAssessmentData 只是一个查询,它返回 DailyAssessment 表中的所有数据。我在不同版本中使用 WHERE PatientDB.Patient_Active = TRUE。但我只是想在过滤活动患者之前首先获得最大/最近的每日评估数据的过滤部分,因为这已经在其他地方工作了。感谢 Gordon 的帮助。 我现在发现查询只返回活动的患者记录,并且在 DailyAssessment 表中有一个条目。是否可以修改查询以返回所有活动患者,即使他们在 DailyAssessments 中没有条目?以上是关于SQL (MS ACCESS) 基于最大值连接表的主要内容,如果未能解决你的问题,请参考以下文章
MS Access 中通过 ODBC 连接 MS SQL 表的查询非常慢