我有两张桌子:
患者
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连接.
如果您使用的是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连接.