回答

收藏

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

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

我有两个表:
8 P) {( l. {4 _! t病人
8 _4 D# ?  b8 b& z6 GpkPatientId
! v; C) E5 @& _
. ^3 |# s+ W" M$ ]; X* x4 L, N8 S
患者状态
) I8 y. p) [3 y) M% Y; P4 ]0 _: p( ?$ m- \pkPatientStatusId
0 ^* H7 D/ ]2 V  L1 {fkPatientId
, `# ]4 n5 }" ~* P) s状态码
0 p  n7 {+ k0 @- q7 f, ^) y开始日期
! ?: c5 p; s1 ^结束日期
病人    -> PatientStatus    是一对多的关系。, v! [( b  ?1 Z' {& B  X
我想知道是否有可能。SQL连接,以便只返回每个病人的前两个PatientStatus如果只有一个记录。PatientStatus记录不得在结果中返回。) `+ b8 \& H7 a3 r" `, k
我查询的普通联系是:/ x" d  `/ G3 B
SELECT FROM Patient p INNER JOIN PatientStatus ps ON p.pkPatientId = ps.fkPatientIdORDER BY ps.fkPatientId,ps.StartDate                . O( P8 `. A- ?
    解决方案:                                                               
/ K: Y" Y& h5 I; g& }                                                                假如你用的是SQL Server 2005或更高版本,所以CTE这可能是最好的选择,但如果你想与其他平台更兼容,你应该能够工作:, x8 K% j3 [& ^  d2 }
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 对我来说,你想要前两种状态而不是后两种状态真的很奇怪,但我假设你知道你想要什么。6 ?* y8 D1 e  y, t2 P
如果性能更好,也可以使用WHERE NOT EXISTS代替PS3和PS4连接。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则