2009-07-16 77 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))