回答

收藏

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

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

我有两个表:
/ n8 P3 q8 Z* {. g病人9 W# B/ r) u* W# ~3 q
pkPatientId
! o" Z0 Z# ~2 Y; I; F) z
: x  r0 ?6 T0 g  P& b* _
患者状态
* Z; F- O" z: y/ I$ O; hpkPatientStatusId
% t0 J+ w  j9 w+ k8 CfkPatientId5 A; M' O/ U9 y3 L. E- ?' C( R; }" o
状态码
2 c5 h9 t6 _5 t开始日期" _) i1 C3 \. u
结束日期
病人    -> PatientStatus    是一对多的关系。
( q5 \  X, M% i  v1 _$ f我想知道是否有可能。SQL连接,以便只返回每个病人的前两个PatientStatus如果只有一个记录。PatientStatus记录不得在结果中返回。% c9 s7 Z' c. |8 M
我查询的普通联系是:
9 W% a9 @9 x$ D# Y4 H' d; USELECT FROM Patient p INNER JOIN PatientStatus ps ON p.pkPatientId = ps.fkPatientIdORDER BY ps.fkPatientId,ps.StartDate                # }0 ^+ E6 r) i
    解决方案:                                                               
  s& j% d. _/ L! v/ m                                                                假如你用的是SQL Server 2005或更高版本,所以CTE这可能是最好的选择,但如果你想与其他平台更兼容,你应该能够工作:) l5 ?4 s" s) c- G
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 对我来说,你想要前两种状态而不是后两种状态真的很奇怪,但我假设你知道你想要什么。
/ S: W# ]! R7 R( w7 E$ x6 d如果性能更好,也可以使用WHERE NOT EXISTS代替PS3和PS4连接。
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则