簡體   English   中英

SQL 加入MS ACCESS最新記錄

[英]SQL Join to the latest record in 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  |
    +----+------+------------+

預先感謝您的閱讀和幫助。

您可以使用聚合和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;

像這樣:select P.ID, P.name, max(A.Date) as Dt from PatientInfo P inner join Appointments P.ID=A.ID group by P.ID, P.name

如果您的匯總表只需要一個字段(Max(Date)),Bing 和 Gordon 的答案都有效,但如果您還想報告連接表中的其他字段,則會變得更加棘手,因為您需要將它們作為聚合字段包括在內或者也按他們分組。 例如,如果您希望您的摘要還包括他們在上次約會時得到的評估,則 GROUP BY 不是 go 的方法。

一個更通用的結構可能是這樣的

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,則可以使您的數據庫更具可讀性。 或者 go 並在其自己的 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 崩潰時總是很難對其進行故障排除 - 我想您看不到任何錯誤代碼或類似代碼。 這是針對 native?accdb 數據庫還是其他服務器?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM