2009-07-16 44 views
0

我拥有表格患者,服务,PatientStatus,状态 - 患者可以有多种服务区分的状态。如何更好地编写此SQL?

我想构建一个视图,为每个服务和每个患者显示他们的当前状态,即使他们没有该服务的状态。

我有一些SQL这样做,但我可以写得更好吗? (我主要是担心在与1 = 1患者的内部连接)

这里的SQL:

select 
    p.Code, 
    s.pkServiceId, 
    ps.fkPatientId, 
    ps.fkStatusId, 
    s.Code AS ServiceCode, 
    s.Description AS ServiceDescription, 
    st.Code AS StatusCode, 
    st.Description as StatusDescription, 
    ps.TsStart 
from 
    Service s 
inner join 
    Patient p on 1 = 1 
left outer join 
     (select 
      max(TsStart) AS TsStart, 
      fkPatientId, 
      fkServiceId 
     from 
      PatientStatus AS ps 
     group by 
      fkServiceId, fkPatientId 
    ) AS psLast on 
     psLast.fkServiceId = s.pkServiceId and 
     psLast.fkPatientId = p.pkPatientId 
left outer join 
    PatientStatus AS ps ON 
     psLast.TsStart = ps.TsStart and 
     psLast.fkPatientId = ps.fkPatientId and 
     psLast.fkServiceId = ps.fkServiceId 
left outer join 
    Status st on 
     st.pkStatusId = ps.fkStatusId 
+0

你可能会得到更多的帮助,如果你提供的样本数据集,然后你想要什么你的数据看起来像一个例子。我发现在这里让我们的一些SQL专家能够快速解决问题是非常有效的。 – TheTXI 2009-07-16 03:36:10

+0

谢谢 - 我会为未来记住这一点,尽管我很高兴自己解决了这个问题。我主要是一名开发人员,但是拥有足够的SQL技能来大部分时间合理的使用它:) – 2009-07-16 09:42:25

回答

4

咄...我1 = 1是一样的重写它作为CROSS JOIN:

从 服务S 交叉连接 患者p

0

我不知道为什么有耐心,服务表之间没有关系?为什么要使用“1 = 1”?

假设PatientService是多对多的关系 ... 服务S 内部联接 (PatientService PS内加入关于ps.PCode = p.Code患者P) 上s.Code = ps.SCode ...

1

如果他们没有该服务的状态,您是否有理由需要行显示患者/服务?看起来这应该是我在前端处理的东西。

也就是说,让你在找什么我可能会使用以下方法:

SELECT 
    P.Code, 
    S.pkServiceID, --Ugh, I hate that naming convention 
    PS.fkPatientID, 
    PS.fkStatusID, 
    S.Code AS ServiceCode, 
    S.Description AS ServiceDescription, 
    ST.Code AS StatusCode, 
    ST.Description AS StatusDescription 
    PS.TsStart 
FROM 
    Patient P 
CROSS JOIN Service S 
LEFT OUTER JOIN PatientStatus PS ON 
    PS.fkPatientID = P.pkPatientID AND 
    PS.fkServiceID = S.pkServiceID 
LEFT OUTER JOIN PatientStatusPS2 ON 
    PS2.fkPatientID = P.pkPatientID AND 
    PS2.fkServiceID = S.pkServiceID AND 
    PS2.TsStart > PS.TsStart 
LEFT OUTER JOIN Status ST ON 
    ST.pkStatusID = PS.fkStatusID 
WHERE 
    PS2.fkPatientID IS NULL 

只是一个快速的音符......如果你有两个状态完全相同的TsStart为同耐心和服务,那么你会在这里得到重复。尽管如此,您也可以从原始查询中获得这些信息。如果需要,您可以编写代码。只要改变最后一行在PS2的加盟:

(PS2.TsStart > PS.TsStart OR (PS2.TsStart = PS.TsStart AND PS2.pkID > PS.pkID))