3

Medical_Master

       MedicalID MedicalName
       1(pk)     abc
       2         xyx
       3         pqr

Child_Medical_Master

       ChildMID MedicalID Station Name
       1(pk)    1(fk)     bnb     mfk
       2        1         def     rwr
       3        2         re      wrw      

医療_訪問

       VTID  PMID  RFMID age
       1(pk) 2(fk) 1      34
       2     2     3      45
       3     3     1      45
       4     1     2      44
       5     2     2      76

Medical_Study

       UID   VTID  ChildMID SMID   Date  time 
       1(pk) 1(fk) 1        1      kk    jdj
       2     2     3        2      kdf   lfl
       6     3     2        3      rgr   rtr

Doctor_Master

       RFMID  Doctorname
       1(pk)  mr.john
       2      mr.jack
       3      mr.jim

PAtient_Master

       PMID   Firstname LastNAme
       1(pk)  df         ere
       2      rwe        rwer
       3      rwr        fwr

Study_Master

       SMID   MedicalID Description Duration
       1(pk)  1(fk)     fdf         efe
       2      1         ddf         dfdf
       3      2         df          ef

これらの列をテーブルから取得したいのですが、正しいクエリはどうすればよいですか?

UID,PMID,FIRSTNAME,LASTNAME,AGE,MEDICALNAME,DESCRIPTION,STATION,DATE,DoctorName

7 つのテーブルで内部結合を使用していますが、正しいデータを取得できません (Doctorname が繰り返されています)。

4

6 に答える 6

3

最終結果に何を求めているのか正確にはわかりませんが、以下のクエリと説明が問題の解決に役立つ場合があります。追加のサンプル データと必要な結果のサンプルがあると役立ちますが、これが私の試みです。

私は小さなクエリから始めて、テーブルを追加することに取り組みました。最初のクエリです。これは大量のデータを取得するわけではありませんが、最終製品のChildMIDとをMedicalId取得します。さらにテーブルを結合するには、とStationが必要です。( SQL フィドル):ChildMIDMedicalId

SELECT *
FROM Medical_Master mm
INNER JOIN Child_medical_Master cmm
  ON mm.MedicalID = cmm.MedicalId

Medical_Study次のテーブルには、前の結合から取得したテーブル結合を追加しましたChildMID。これによりUID、最終製品 ( SQL Fiddle ) が得られます。

SELECT *
FROM Medical_Master mm
INNER JOIN Child_medical_Master cmm
  ON mm.MedicalID = cmm.MedicalId
INNER JOIN Medical_Study ms
  ON cmm.ChildMID = ms.ChildMID

次の結合では、Study_Masterテーブルを追加しました。ここでは、2 つの別々のフィールドでテーブルを結合するという点で、少し異なることを行いました。このクエリではSMID、調査が正しいことを確認するために両方のフィールドに参加しましたMedicalIDが、正しい医療記録を使用していることを確認するためにフィールドにも参加しました。( SQL Fiddleを参照してください) 両方のフィールドで結合しない場合、 の項目ごとに 1 つのレコードが取得されますがMedical_Study、Study と Medical の両方が一致する項目が必要なようです。

SELECT *
FROM Medical_Master mm
INNER JOIN Child_medical_Master cmm
  ON mm.MedicalID = cmm.MedicalId
INNER JOIN Medical_Study ms
  ON cmm.ChildMID = ms.ChildMID
INNER JOIN Study_Master sm
  ON ms.SMID = sm.SMID
  AND mm.MedicalID = sm.MedicalID  -- results change if you remove this line

Medical_Visit次のクエリは、とを追加するという点で、少し簡単ですPatient_Master。( SQL フィドル)

SELECT *
FROM Medical_Master mm
INNER JOIN Child_medical_Master cmm
  ON mm.MedicalID = cmm.MedicalId
INNER JOIN Medical_Study ms
  ON cmm.ChildMID = ms.ChildMID
INNER JOIN Study_Master sm
  ON ms.SMID = sm.SMID
  AND mm.MedicalID = sm.MedicalID
INNER JOIN Medical_Visit mv
  ON ms.VTID = mv.VTID
INNER JOIN Patient_Master pm
  ON mv.PMID = pm.PMID

追加する最終テーブルはDoctor_Master、医師の名前を取得するテーブルです。( SQL Fiddle ) テーブルを追加する前に提供されたサンプル データを使用すると、Doctor_Master1 つのレコードがありますが、最終的には 3 になります。これは、PMIDある時点で 3 人の医師全員を診察したためです。

SELECT *
FROM Medical_Master mm
INNER JOIN Child_medical_Master cmm
  ON mm.MedicalID = cmm.MedicalId
INNER JOIN Medical_Study ms
  ON cmm.ChildMID = ms.ChildMID
INNER JOIN Study_Master sm
  ON ms.SMID = sm.SMID
  AND mm.MedicalID = sm.MedicalID
INNER JOIN Medical_Visit mv
  ON ms.VTID = mv.VTID
INNER JOIN Patient_Master pm
  ON mv.PMID = pm.PMID
INNER JOIN Doctor_Master dm
  ON mv.RFMID = dm.RFMID

最終的なクエリで不要なフィールドをすべて削除すると、次のようになります。

SELECT ms.UID,
    pm.PMID,
    pm.firstname,
    pm.lastname,
    mv.age,
    mm.medicalname,
    sm.description,
    cmm.station,
    ms.[date],
    dm.doctorname
FROM Medical_Master mm
INNER JOIN Child_medical_Master cmm
    ON mm.MedicalID = cmm.MedicalId
INNER JOIN Medical_Study ms
    ON cmm.ChildMID = ms.ChildMID
INNER JOIN Study_Master sm
    ON ms.SMID = sm.SMID
    AND mm.MedicalID = sm.MedicalID
INNER JOIN Medical_Visit mv
    ON ms.VTID = mv.VTID
INNER JOIN Patient_Master pm
    ON mv.PMID = pm.PMID
INNER JOIN Doctor_Master dm
    ON mv.RFMID = dm.RFMID

これはあなたが探している結果を生み出すと思います。

于 2012-08-09T12:58:06.397 に答える
2

Njg、これを明確にするために、医師の名前が繰り返される理由は、彼らが複数の患者を訪問し、各患者がその1人の医師によって何度も診察されるためです. たとえば、医師に 3 回診察された 1 人の患者の場合、medical_visit テーブルには 3 回の個別の来院が記録されているため、3 つの「重複した」行が表示されます。

各患者の詳細 (名、姓、年齢、病院の場所、医師) だけを表示したい場合は、最初に次の行を削除します。

INNER JOIN Medical_Visit ON Medical_Visit.VTID=Medical_Study.VTID

次に、その結​​合に依存する他のテーブルを回避します。何が情報を複製しているのかがわかるまで、他の結合を削除する必要があるかもしれません。テーブルからの重複を減らすために結合でサブクエリを使用する必要がある場合がありますが、最初にどのテーブルが重複を引き起こしているかを特定します (例のテーブルでは SQLFiddle を使用できません)。

于 2012-07-31T14:20:35.497 に答える
1

複雑なクエリを作成することが常に最善の解決策であるとは限りません。結合を操作するには、必要な結果を得るために、左/右/完全な内部/外部結合が必要な場所を非常に適切に制御する必要があります。

複雑なクエリの欠点は、作成に時間がかかることに加えて、後で理解することができなくなり、メンテナンスが悪夢になることです。

また、あなたが望む結果は何ですか?特定の値が1回だけ発生することを期待していることによく気づきましたが、実際のシナリオでは、複数の同一の値を持つことが有効な場合があります。TimHodgesからのコメントを参照してください。

私見では、データがより単純なレベルで結合され、最終的にそれらのビューから結合されるいくつかのビューを作成する方が良いオプションかもしれません。このシナリオでは、混乱する可能性が低くなり、データがどのように表示されるかをより適切に制御できるようになります。

それでも現在のパスを続行したい場合は、期待される結果(列名ではなくデータ)を、使用している現在のクエリ(およびその誤った結果、なぜ/どのように正しくないかを説明する)と一緒に投稿してください。さらにお手伝いします。

于 2012-08-09T13:37:12.533 に答える
0

このクエリを実行します。

SELECT    MS.UID, PM.PMID, PM.Firstname, PM.LastNAme, MV.age, 
          MM.MedicalName, SM.Description, 
          CMM.Station, MS.Date, DM.Doctorname
FROM      Child_Medical_Master CMM LEFT OUTER JOIN
          Medical_Master MM ON CMM.MedicalID = MM.MedicalID RIGHT OUTER JOIN
          Study_Master SM RIGHT OUTER JOIN
          Doctor_Master DM INNER JOIN
          PAtient_Master PM INNER JOIN
          Medical_Visit MV ON PM.PMID = MV.PMID INNER JOIN
          Medical_Study MS ON MV.VTID = MS.VTID ON DM.RFMID = MV.RFMID ON 
          SM.SMID = MS.SMID ON CMM.ChildMID = MS.ChildMID

このフィドルを参照してください。

于 2012-08-04T05:20:19.930 に答える
0

以下のものを試してください:

    Select MS.UID,
      PM.PMID,
      PM.FIRSTNAME,
      PM.LASTNAME,
      MV.PMID,
      MV.AGE,
      MM.MedicalName,
      SM.Description
      CMM.Station,
      MS.Date,
      DM.Doxtorname                                     
    From Patient_Master PM 
      inner join Medical_Visit MV On PM.PMID = MV.PMID
      inner join Medical_Study MS On MV.UID = MS.UID
      inner join Study_Master SM On SM.SMID = MS.SMID
      inner join Medical_Master MM On MM.MedicalID = SM.MedicalID
      inner join Child_Medical_Master CMM On CMM.MedicalID = MM.MedicalID
      inner join Doctor_Master DM On Dm.RFMID = MV.RFMID
于 2012-08-04T04:52:34.030 に答える
0

私ができることについては、次のクエリがあります

select  u.UID
      , p.PMID
      , p.FIRSTNAME
      , p.LASTNAME
      , v.AGE
      , m.MEDICALNAME
      , u.DESCRIPTION
      , c.STATION
      , s.DATE
      , a.DoctorName
from    medical_master m
        inner join Child_Medical_Master c
          on  m.MedicalID = c.MedicalID
        inner join Medical_Study s
          on  s.ChildMID = c.ChildMID
        inner join Medical_Visit v
          on  v.VTID = s.VTID
        inner join Doctor_Master a
          on  a.RFMID = v.RFMID
        inner join Patient_Master p
          on  p.PMID = v.PMID
        inner join Study_Master u
          on  u.SMID = s.SMID

私はこの結果を得る

結果

u.UID |##| p.PMID |##| p.FIRSTNAME |##| p.LASTNAME |##| v.AGE |##| m.MEDICALNAME |##| u.DESCRIPTION |##| c.STATION |##| s.DATE |##| a.医師名

1 |##| 2 |##| rwe |##| ワー |##| 34 |##| abc |##| fdf |##| bnb |##| kk |##| ジョンさん

6 |##| 3 |##| rwr |##| fwr |##| 45 |##| abc |##| df |##| デフ |##| rgr |##| ジョンさん

2 |##| 2 |##| rwe |##| ワー |##| 45 |##| xyx |##| ddf |##| れ |##| kdf |##| ジムさん

ええ、あなたのデータによると、mr.john を 2 回取得します。また、別の人には2つの異なる年齢が表示されることもわかります...それはちょっと典型的です. データのサニティチェックを行いましたか?? どこかで間違っていると思います...

于 2012-08-03T15:10:56.740 に答える