加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 06:45:28 所属栏目:MsSql教程 来源:网络整理
导读:我有两张桌子: 患者 pkPatientId FirstName 姓氏 PatientStatus pkPatientStatusId fkPatientId StatusCode StartDate EndDate 患者 – PatientStatus是一对多关系. 我想知道在SQL中是否可以进行连接,该连接仅返回每个患者的前两个??PatientStatus记录.如果
我有两张桌子:

患者

> pkPatientId
> FirstName
>姓氏

PatientStatus

> pkPatientStatusId
> fkPatientId
> StatusCode
> StartDate
> EndDate

患者 – > PatientStatus是一对多关系.

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

我的查询的正常连接是:

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

解决方法

如果您使用的是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连接.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读