SQL 连接到 MS ACCESS 中的最新记录

问题描述

我想在 MS Access 中以这样一种方式连接表,即它只从其中一个表中获取最新记录。我查看了站点上可用的其他解决方案,但发现它们仅适用于其他版本的 sql。这是我的数据的简化版本:

患者信息表:

    +-----+------+
    | ID  | Name |
    +-----+------+
    |  1  | John |
    |  2  | Tom  |
    |  3  | Anna |
    +-----+------+

约会表

    +----+-----------+
    | ID |   Date    |
    +----+-----------+
    |  1 | 5/5/2001  |
    |  1 | 10/5/2012 |
    |  1 | 4/20/2018 |
    |  2 | 4/5/1999  |
    |  2 | 8/8/2010  |
    |  2 | 4/9/1982  |
    |  3 | 7/3/1997  |
    |  3 | 6/4/2015  |
    |  3 | 3/4/2017  |
    +----+-----------+

这是我在加入后需要的结果的简化版本:

    +----+------+------------+
    | ID | Name |    Date    |
    +----+------+------------+
    |  1 | John |  4/20/2018 |
    |  2 | Tom  |  8/8/2010  |
    |  3 | Anna |  3/4/2017  |
    +----+------+------------+

提前感谢您的阅读和帮助。

解决方法

是这样的: 选择 P.ID、P.name、max(A.Date) 作为 Dt 来自 PatientInfo P 内连接约会 A P.ID=A.ID 按 P.ID、P.name 分组

,

如果您的汇总表只需要一个字段(Max(Date)),Bing 和 Gordon 的答案都有效,但如果您还想报告连接表中的其他字段,则变得更加棘手,因为您需要将它们作为聚合的字段或组。 例如,如果您希望您的摘要也包括他们在上次约会时的评估,那么 GROUP BY 不是可行的方法。

更通用的结构可能类似于

SELECT Patient.ID,Patient.Name,Appointment.Date,Appointment.Assessment
FROM Patient INNER JOIN Appointment ON Patient.ID=Appointment.ID
WHERE Appointment.Date = (SELECT Max(Appointment.Date) FROM Appointment WHERE Appointment.ID = Patient.ID)
;

顺便说一句,您可能想考虑是否应该使用名为“ID”的字段来引用另一个表的 ID(在这种情况下,Apppintment.ID 字段引用 Patient.ID)。如果您将“ID”字段保留为特定于该表的标识符,并将其他表中的该字段称为 OtherTableID 或类似名称(即在这种情况下为 PatientID),则可能会使您的数据库更具可读性。或者一直在其自己的 ID 字段中包含实际表的名称。

评论后编辑:

不太清楚为什么会崩溃。我只是在我拥有的 2 个表上运行了一个等效的查询,每个表大约有 10,000 条记录,而且非常即时。您的 ID 字段是否 (i) 唯一编号和 (ii) 已编入索引? 另一种应该做同样事情的结构(适用于您的字段名称并假设约会中有一个唯一的 ID 字段)类似于:

SELECT PatientInfo.UID,PatientInfo.Name,Appointments.StartDateTime,Appointments.Assessment
FROM PatientInfo INNER JOIN Appointments ON PatientInfo_UID = Appointments.PatientFID
WHERE Appointments.ID = (SELECT TOP 1 ID FROM Appointments WHERE Appointments.PatientFID = PatientInfo_UID ORDER BY StartDateTime DESC)
;

但这开始看起来有点做作。在我的数据上,它们都产生相同的结果(它们应该如此!)并且几乎都是瞬时的。 当 Access 崩溃时总是很难对其进行故障排除 - 我猜你没有看到错误代码或类似的代码?这是针对本地 .accdb 数据库还是其他服务器?