2009-07-16 13 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

:だけにPS2に参加して最後の行を変更します。私は、ここで私たちのSQLの専門家の一部を迅速に解決してもらうのに非常に効果的であることを発見しました。 – TheTXI

+0

ありがとう - 私はこれを自分で解決したことはかなり幸せですが、将来のことを心に留めておきます。私は主に開発者ですが、ほとんどの時間に合理的なものを叩くのに十分なSQLスキルを持っています:) –

答えて

4

おやおや...私の1 = 1は、CROSSとしてそれを書き換えると同じです登録しよう:患者およびサービステーブルの間に関係がない理由

サービスの クロスから 患者Pに参加

0

私が不思議に思っていましたか?なぜ "1 = 1"を使用すべきですか?サービスの インナーはs.Code = ps.SCodeに (PatientService psのインナーがps.PCode = p.Codeに患者Pへの参加) に参加 ... PatientServiceは、多くの関係 に多くあると仮定すると

...

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を持つ2つのステータスを持っている場合は、患者とサービスは、ここで重複を取得します。あなたは元のクエリからそれらも取得します。必要に応じてコードを記述することができます。あなたは、サンプルデータセットと、あなたはあなたのデータが見えるようにしたいものの例を提供する場合あなたが少しより多くの助けを得ることができます

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

ヒントはありますが、フロントエンドは重複を防ぎますが、データベースにも一意の制約があるはずです。そして、はい、必要条件は、患者がステータスを持っていないことがあっても、すべてのサービスを表示することです。 –

+0

私は、フロントエンドが明示的にデータベースから返送されることなく「空白」のエントリを作成できる必要があると考えています。私はほとんどのボックスコントロールから、結果セットにバインドして実行する方が簡単だということを知っています。 –

関連する問題