SQL 加入 MS ACCESS 中的最新记录
Posted
技术标签:
【中文标题】SQL 加入 MS ACCESS 中的最新记录【英文标题】:SQL Join to the latest record in MS ACCESS 【发布时间】:2021-04-17 22:20:50 【问题描述】:我想在 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 |
+----+------+------------+
提前感谢您的阅读和帮助。
【问题讨论】:
【参考方案1】:你可以使用聚合和JOIN
:
select pi.id, pi.name, max(a.date)
from appointments as a inner join
patientinfo as pi
on a.id = pi.id
group by pi.id, pi.name;
【讨论】:
【参考方案2】:类似这样的: 选择 P.ID、P.name、max(A.Date) 作为 Dt 从 PatientInfo P 内部加入约会 A 在 P.ID=A.ID 上 按 P.ID、P.name 分组
【讨论】:
【参考方案3】:如果您的汇总表只需要一个字段(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) 已编入索引? 另一个应该做同样事情的结构(适用于您的字段名称并假设 Appointments 中有一个唯一的 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 数据库还是其他服务器?
【讨论】:
我喜欢您建议的查询,因为我也想报告其他字段,但我正在处理超过 60,000 行,您的建议导致 Access 崩溃。有什么建议?这是代码:SELECT PatientInfo.Patient_UID, PatientInfo.LastName, PatientInfo.FirstName, PatientInfo.Email, PatientInfo.Deceased, Appointments.StartDateTime FROM PatientInfo INNER JOIN Appointments ON PatientInfo.Patient_UID=Appointments.PatientFID WHERE Appointments.StartDateTime = (SELECT Max(Appointments.StartDateTime) FROM Appointments WHERE Appointments.PatientFID = PatientInfo.Patient_UID) ;
以上是关于SQL 加入 MS ACCESS 中的最新记录的主要内容,如果未能解决你的问题,请参考以下文章