回答

收藏

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

技术问答 技术问答 440 人阅读 | 0 人回复 | 2023-09-14

我有两个表:& z' b" }, U( D- S) Z
病人; ^' ]/ K3 P% I. S- R/ q  ?
pkPatientId8 r+ I1 S" B8 Q1 q# Y& ]) S' ?" Q6 c

/ \3 Z. D0 o6 V' z0 \- ?7 T; y
患者状态# z& ~0 D7 Q: Y) O, n( ]
pkPatientStatusId
  a& ]' S5 B% ffkPatientId1 w8 E/ t1 Y1 ~' A" E% M. O3 O
状态码0 F& R3 ~( Z- G/ X
开始日期9 J, s/ ^3 q7 [; a* Y2 S' Z& @
结束日期
病人    -> PatientStatus    是一对多的关系。0 |& p5 v; [& {, ^
我想知道是否有可能。SQL连接,以便只返回每个病人的前两个PatientStatus如果只有一个记录。PatientStatus记录不得在结果中返回。* ?8 }  j* E4 Y
我查询的普通联系是:
4 b& P" l9 d$ KSELECT FROM Patient p INNER JOIN PatientStatus ps ON p.pkPatientId = ps.fkPatientIdORDER BY ps.fkPatientId,ps.StartDate                ' d+ F' i# P1 ]  L
    解决方案:                                                               
8 g+ H5 J. J/ Q) ~5 Q                                                                假如你用的是SQL Server 2005或更高版本,所以CTE这可能是最好的选择,但如果你想与其他平台更兼容,你应该能够工作:  G" \! c! q8 P
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 SecondStatusEndDateFROM     Patient PINNER JOIN PatientStatus PS1 ON     PS1.fkPatientID = P.pkPatientIDINNER JOIN PatientStatus PS2 ON     PS2.fkPatientID = P.pkPatientID AND     PS2.StartDate > PS1.StartDateLEFT OUTER JOIN PatientStatus PS3 ON     PS3.fkPatientID = P.pkPatientID AND     PS3.StartDate  PS1.StartDate AND     PS4.StartDate 对我来说,你想要前两种状态而不是后两种状态真的很奇怪,但我假设你知道你想要什么。, L! Y" h/ L6 J% G3 S6 r+ [
如果性能更好,也可以使用WHERE NOT EXISTS代替PS3和PS4连接。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则