我有两张桌子:
Patient
患者状态
- pkPatientStatusId
- fk患者 ID
- 状态码
- 开始日期
- EndDate
Patient -> 患者状态是一对多的关系。
我想知道是否可以在 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 连接。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)