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】:

您不能再次使用列别名 -- 不能在 SELECTWHEREON 中使用(好吧,您可以在 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 表的查询非常慢

MS Access 2007 中的 SQL 内部连接

左连接 SQL 查询 - MS Access

SQL-Server 后端、MS Access 前端:连接

Ms Access SQL:连接用逗号分隔的一对多关系[重复]

MS Access 和 SQL Server 连接(可信来源与传递登录凭据)