回答

收藏

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

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

我有两个表:
( S0 H+ i9 H# X( ]+ @( Q7 Z病人+ {8 |% S, ]# R( O" _' ?
pkPatientId
- D9 y# ~8 C# Y0 g% Q3 u0 s, u) M. y1 [$ g4 m( a1 x. }7 [4 n
患者状态
& g# J, q8 v6 r4 s; HpkPatientStatusId$ @/ N1 I# y) y! I( ?( F
fkPatientId
5 X( P; q6 b1 N% }& J5 l状态码: |/ j/ \4 B6 W$ b
开始日期8 ~( e- A- d. b2 H" {
结束日期
病人    -> PatientStatus    是一对多的关系。
" S$ e9 A" M0 h& k4 o/ d- J我想知道是否有可能。SQL连接,以便只返回每个病人的前两个PatientStatus如果只有一个记录。PatientStatus记录不得在结果中返回。
( e4 K- c* ~& |0 N  N. P( ~我查询的普通联系是:
  F7 B3 {  ]+ M: r! ySELECT FROM Patient p INNER JOIN PatientStatus ps ON p.pkPatientId = ps.fkPatientIdORDER BY ps.fkPatientId,ps.StartDate               
. k4 Y4 v* j; {+ x    解决方案:                                                               
0 F0 x# G# r7 Z% u                                                                假如你用的是SQL Server 2005或更高版本,所以CTE这可能是最好的选择,但如果你想与其他平台更兼容,你应该能够工作:
  o( V& W) ?5 j  l7 fSELECT     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 对我来说,你想要前两种状态而不是后两种状态真的很奇怪,但我假设你知道你想要什么。
" H2 v5 Q" ?$ S& j* _如果性能更好,也可以使用WHERE NOT EXISTS代替PS3和PS4连接。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则