从多个表中获取数据

时间:2012-07-31 10:58:06

标签: sql sql-server

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      

Medical_Visit

       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个表上使用内连接但没有获得正确的数据。(医生名称重复)

6 个答案:

答案 0 :(得分:3)

虽然我不确切地知道您对最终结果的要求,但下面的查询和说明可能有助于解决您的问题。拥有额外的样本数据和您想要的结果样本会有所帮助,但这是我的尝试。

我从较小的查询开始,并努力添加表格。第一个查询,这不会为您提供大量数据,但会为您的最终产品提供ChildMIDMedicalIdStation。您需要ChildMIDMedicalId来加入更多表格。 (SQL Fiddle):

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

下一个表格我添加了Medical_Study表格,您加入了之前加入的ChildMID。这将为您提供最终产品UID中的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

在下一次加入时,我添加了SMID表。在这里,我做了一些略有不同的事情,因为我在两个单独的字段中加入了表格。对于此查询,我加入了MedicalID字段以验证该研究是否正确,但我也加入了Medical_Study字段以确保它使用了正确的医疗记录。 (请参阅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 INNER JOIN Study_Master sm ON ms.SMID = sm.SMID AND mm.MedicalID = sm.MedicalID -- results change if you remove this line 中每个项目的一条记录,但您似乎希望同时包含Study和Medical的项目。

Medical_Visit

下一个查询更容易一点,因为您要添加Patient_MasterSELECT * 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 。 (SQL Fiddle

Doctor_Master

要添加的最终表格是Doctor_Master,它将为您提供Doctor的名称。 (SQL Fiddle)使用在添加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 在某个时刻见过所有3位医生。

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

删除您不希望最终查询的所有字段:

{{1}}

我认为这会产生您正在寻找的结果。

答案 1 :(得分:2)

Njg,只是为了明确医生的名字将重复的原因是他们将访问一位以上的病人,每位病人将会被这位医生多次看到。因此,例如,对于已经被医生看过3次的一名患者,他们将有3条“重复”线,因为medical_visit表记录了3次单独访问。

如果您只想显示每位患者的详细信息(姓名,姓氏,年龄,住院位置和医生),那么我最初会删除以下内容:

INNER JOIN Medical_Visit ON Medical_Visit.VTID=Medical_Study.VTID

然后解决依赖于该连接的其他表。看看,看看它做了什么,你可能需要删除其他连接,直到你发现什么是重复的信息。可能是您需要在联接中使用子查询来减少来自表的重复,但首先要确定哪个表导致重复 (我不能将SQLFiddle用于您的示例表。)

答案 2 :(得分:1)

构建复杂查询可能并不总是最佳解决方案。使用连接需要您可以非常好地控制左/右/全内/外连接所需的位置以获得所需的结果。

复杂查询的缺点是,除了需要时间创建之外,您将无法在以后理解并且维护将成为一场噩梦。

另外,您想要的结果是什么?我经常意识到我只期待一次特定值的出现,但在实际情况中,在某些情况下,它可能有多个相同的值。请参阅Tim Hodges的评论。

恕我直言,创建一些视图可能是一个更好的选择,其中数据在更简单的级别上连接在一起,然后最终您从这些视图中加入。在这种情况下,您最不会感到困惑,并且可以更好地控制数据的外观。

如果您仍想继续使用当前路径,请将预期结果(数据,而不是列名称)与您正在使用的当前查询一起发布(及其错误结果,描述原因/如何不正确),为了我们进一步帮助您。

答案 3 :(得分: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.DoctorName

1 | ## | 2 | ## | rwe | ## | rwer | ## | 34 | ## | abc | ## | fdf | ## | bnb | ## | kk | ## |约翰先生

6 | ## | 3 | ## | rwr | ## | fwr | ## | 45 | ## | abc | ## | df | ## | def | ## | rgr | ## |约翰先生

2 | ## | 2 | ## | rwe | ## | rwer | ## | 45 | ## | xyx | ## | ddf | ## | re | ## | kdf | ## | mr.jim

所以,是的,根据你的数据,你得到了约翰先生2次。我还看到,对于另一个人,你会得到2个不同年龄的...这是一种典型的。 你有没有对你的数据进行健全性检查?我觉得那里的某个地方出了问题...

答案 4 :(得分: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

答案 5 :(得分: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

this fiddle