当前位置:  开发笔记 > 数据库 > 正文

SQL查询 - Join返回连接表的前两个记录

如何解决《SQL查询-Join返回连接表的前两个记录》经验,为你挑选了1个好方法。

我有两张桌子:

患者

pkPatientId

名字

PatientStatus

pkPatientStatusId

fkPatientId

的StatusCode

开始日期

结束日期

患者 - > PatientStatus是一对多的关系.

我想知道在SQL中是否可以进行连接,该连接仅返回每个患者的前两个​​PatientStatus记录.如果仅存在一个PatientStatus记录,则不应在结果中返回此记录.

我的查询的正常连接是:

SELECT FROM Patient p INNER JOIN PatientStatus ps ON p.pkPatientId = ps.fkPatientId
ORDER BY ps.fkPatientId, ps.StartDate

Tom H.. 6

如果您使用的是SQL Server 2005或更高版本,CTE可能是您最好的选择,但如果您想要与其他平台更兼容的东西,这应该可行:

SELECT
     P.pkPatientID,
     P.FirstName,
     P.LastName,
     PS1.StatusCode AS FirstStatusCode,
     PS1.StartDate AS FirstStatusStartDate,
     PS1.EndDate AS FirstStatusEndDate,
     PS2.StatusCode AS SecondStatusCode,
     PS2.StartDate AS SecondStatusStartDate,
     PS2.EndDate AS SecondStatusEndDate
FROM
     Patient P
INNER JOIN PatientStatus PS1 ON
     PS1.fkPatientID = P.pkPatientID
INNER JOIN PatientStatus PS2 ON
     PS2.fkPatientID = P.pkPatientID AND
     PS2.StartDate > PS1.StartDate
LEFT OUTER JOIN PatientStatus PS3 ON
     PS3.fkPatientID = P.pkPatientID AND
     PS3.StartDate < PS1.StartDate
LEFT OUTER JOIN PatientStatus PS4 ON
     PS4.fkPatientID = P.pkPatientID AND
     PS4.StartDate > PS1.StartDate AND
     PS4.StartDate < PS2.StartDate
WHERE
     PS3.pkPatientStatusID IS NULL AND
     PS4.pkPatientStatusID IS NULL

对我来说,你想要前两个状态而不是最后两个状态似乎有点奇怪,但我会假设你知道你想要什么.

如果你获得更好的性能,你也可以使用WHERE NOT EXISTS而不是PS3和PS4连接.



1> Tom H..:

如果您使用的是SQL Server 2005或更高版本,CTE可能是您最好的选择,但如果您想要与其他平台更兼容的东西,这应该可行:

SELECT
     P.pkPatientID,
     P.FirstName,
     P.LastName,
     PS1.StatusCode AS FirstStatusCode,
     PS1.StartDate AS FirstStatusStartDate,
     PS1.EndDate AS FirstStatusEndDate,
     PS2.StatusCode AS SecondStatusCode,
     PS2.StartDate AS SecondStatusStartDate,
     PS2.EndDate AS SecondStatusEndDate
FROM
     Patient P
INNER JOIN PatientStatus PS1 ON
     PS1.fkPatientID = P.pkPatientID
INNER JOIN PatientStatus PS2 ON
     PS2.fkPatientID = P.pkPatientID AND
     PS2.StartDate > PS1.StartDate
LEFT OUTER JOIN PatientStatus PS3 ON
     PS3.fkPatientID = P.pkPatientID AND
     PS3.StartDate < PS1.StartDate
LEFT OUTER JOIN PatientStatus PS4 ON
     PS4.fkPatientID = P.pkPatientID AND
     PS4.StartDate > PS1.StartDate AND
     PS4.StartDate < PS2.StartDate
WHERE
     PS3.pkPatientStatusID IS NULL AND
     PS4.pkPatientStatusID IS NULL

对我来说,你想要前两个状态而不是最后两个状态似乎有点奇怪,但我会假设你知道你想要什么.

如果你获得更好的性能,你也可以使用WHERE NOT EXISTS而不是PS3和PS4连接.

推荐阅读
乐韵答题
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有