Sql 如何根据不同多个表中每个用户的最大日期获取记录

Sql 如何根据不同多个表中每个用户的最大日期获取记录,sql,ms-access,Sql,Ms Access,我正在尝试进行一个查询,可以选择名称、DateOfSpecimenResult、SwabResult、DateOfReleaseOfResult。以下是视觉表现: 表格:ContactTracingHeader | AutoID | Name | 1 Jason 2 Chris 表:拭子 | PatientNo | DateOfSpecimenCollection | SwabResultID | DateOfReleaseOfResult |

我正在尝试进行一个查询,可以选择名称、DateOfSpecimenResult、SwabResult、DateOfReleaseOfResult。以下是视觉表现:

表格:ContactTracingHeader

| AutoID |   Name  | 
    1       Jason
    2       Chris
表:拭子

| PatientNo | DateOfSpecimenCollection | SwabResultID | DateOfReleaseOfResult |
      1             05/02/2020                1               05/10/2020
      1             06/08/2020                1               06/11/2020
      1             07/16/2020                2               07/20/2020
注意:ContactTracingHeader.AutoID=Swab.PatientNo

表格:SwabResult

| AutoID | SwabResult |
     1      POSITIVE
     2      NEGATIVE
我正在尝试进行的查询输出

| AutoID |  Name  | DateOfSpecimenCollection | SwabResult | DateOfReleaseOfResult |
     1     Jason          07/16/2020            NEGATIVE          07/20/2020
     2     Chris          (BLANK)               (BLANK)            (BLANK)
注:Swab.ResultID=SwabResult.AutoID

在这里,我只想显示一个
名称
,其中包含样本收集的最新
日期
,然后将其用作另两列的参考,这两列分别是
SwabResult
DateOfReleaseOfResult
,因为“Chris”在拭子表上没有输入,他的记录为空,但他的姓名和
AutoID
仍显示在表上。
SwabResult
显示
阴性
,或
阳性
,具体取决于表拭子的ID

到目前为止,我所做的是:

SELECT
CTH.AutoID, 
CTH.Firstname, 
CTH.Lastname, 

(SELECT MAX(DateOfSpecimenCollection)
            FROM Swab
            WHERE Swab.PatientNo = CTH.AutoID
        ) AS DateOfSpecimenCollection,

Swab.SwabResultID,

Swab.DateOfReleaseOfResult

FROM ContactTracingHeader AS CTH LEFT JOIN Swab ON Swab.PatientNo = CTH.AutoID;
此查询获取样本收集的最新日期,并输出不在拭子表中的记录,这是正确的,但是它会复制记录,具体取决于它有多少记录。我还尝试了
internal JOIN
表SwabResult,以便可以输出
SwabResult
而不是ID,但是它给了我JOIN表达式not supported错误


很抱歉,在我努力在互联网上寻找答案的过程中,给出了冗长而混乱的解释和重复的问题。谢谢大家!

拭子表中需要唯一标识符。如果还没有,则应使用自动编号

考虑:

问题1:

SELECT Swab.* FROM Swab WHERE ID IN 
   (SELECT TOP 1 ID FROM Swab AS Dupe WHERE Dupe.PatientNo=Swab.PatientNo 
    ORDER BY Dupe.DateOfSpecimenCollection DESC);
SELECT Swab.PatientNo, Max(Swab.DateOfSpecimenCollection) AS MaxOfDateOfSpecimenCollection
FROM Swab
GROUP BY Swab.PatientNo;
问题2

SELECT ContactTracingHeader.AutoID, ContactTracingHeader.Name, Query1.DateOfSpecimenCollection, 
SwabResult.SwabResult, Query1.DateOfReleaseOfResult
FROM ContactTracingHeader LEFT JOIN (SwabResult RIGHT JOIN Query1 
ON SwabResult.AutoID = Query1.SwabResultID) 
ON ContactTracingHeader.AutoID = Query1.PatientNo;
或者这个序列:

问题1:

SELECT Swab.* FROM Swab WHERE ID IN 
   (SELECT TOP 1 ID FROM Swab AS Dupe WHERE Dupe.PatientNo=Swab.PatientNo 
    ORDER BY Dupe.DateOfSpecimenCollection DESC);
SELECT Swab.PatientNo, Max(Swab.DateOfSpecimenCollection) AS MaxOfDateOfSpecimenCollection
FROM Swab
GROUP BY Swab.PatientNo;
问题2:

SELECT Swab.PatientNo, Swab.DateOfSpecimenCollection, Swab.SwabResultID, 
Swab.DateOfReleaseOfResult
FROM Query1 INNER JOIN Swab 
ON (Query1.MaxOfDateOfSpecimenCollection = Swab.DateOfSpecimenCollection) 
AND (Query1.PatientNo = Swab.PatientNo);
问题3:

SELECT ContactTracingHeader.AutoID, ContactTracingHeader.Name, 
Query2.DateOfSpecimenCollection, SwabResult.SwabResult, Query2.DateOfReleaseOfResult
FROM SwabResult RIGHT JOIN (ContactTracingHeader LEFT JOIN Query2 
ON ContactTracingHeader.AutoID = Query2.PatientNo) 
ON SwabResult.AutoID = Query2.SwabResultID;

我知道这需要两个查询,我一直强迫自己使用一个查询。当我看到这些参数值时,我认为我得到了一些错误。非常感谢你!可以将第一个查询嵌套在第二个查询中,以获得一个多功能语句。