Sql 从多个表中获取数据

Sql 从多个表中获取数据,sql,sql-server,Sql,Sql Server,医学硕士 MedicalID MedicalName 1(pk) abc 2 xyx 3 pqr ChildMID MedicalID Station Name 1(pk) 1(fk) bnb mfk 2 1 def rwr 3 2 re wrw

医学硕士

       MedicalID MedicalName
       1(pk)     abc
       2         xyx
       3         pqr
       ChildMID MedicalID Station Name
       1(pk)    1(fk)     bnb     mfk
       2        1         def     rwr
       3        2         re      wrw      
       RFMID  Doctorname
       1(pk)  mr.john
       2      mr.jack
       3      mr.jim
       PMID   Firstname LastNAme
       1(pk)  df         ere
       2      rwe        rwer
       3      rwr        fwr
       SMID   MedicalID Description Duration
       1(pk)  1(fk)     fdf         efe
       2      1         ddf         dfdf
       3      2         df          ef
儿童医学硕士

       MedicalID MedicalName
       1(pk)     abc
       2         xyx
       3         pqr
       ChildMID MedicalID Station Name
       1(pk)    1(fk)     bnb     mfk
       2        1         def     rwr
       3        2         re      wrw      
       RFMID  Doctorname
       1(pk)  mr.john
       2      mr.jack
       3      mr.jim
       PMID   Firstname LastNAme
       1(pk)  df         ere
       2      rwe        rwer
       3      rwr        fwr
       SMID   MedicalID Description Duration
       1(pk)  1(fk)     fdf         efe
       2      1         ddf         dfdf
       3      2         df          ef
就诊

       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
医学研究

       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
博士/硕士

       MedicalID MedicalName
       1(pk)     abc
       2         xyx
       3         pqr
       ChildMID MedicalID Station Name
       1(pk)    1(fk)     bnb     mfk
       2        1         def     rwr
       3        2         re      wrw      
       RFMID  Doctorname
       1(pk)  mr.john
       2      mr.jack
       3      mr.jim
       PMID   Firstname LastNAme
       1(pk)  df         ere
       2      rwe        rwer
       3      rwr        fwr
       SMID   MedicalID Description Duration
       1(pk)  1(fk)     fdf         efe
       2      1         ddf         dfdf
       3      2         df          ef
患者_-Master

       MedicalID MedicalName
       1(pk)     abc
       2         xyx
       3         pqr
       ChildMID MedicalID Station Name
       1(pk)    1(fk)     bnb     mfk
       2        1         def     rwr
       3        2         re      wrw      
       RFMID  Doctorname
       1(pk)  mr.john
       2      mr.jack
       3      mr.jim
       PMID   Firstname LastNAme
       1(pk)  df         ere
       2      rwe        rwer
       3      rwr        fwr
       SMID   MedicalID Description Duration
       1(pk)  1(fk)     fdf         efe
       2      1         ddf         dfdf
       3      2         df          ef
学习硕士

       MedicalID MedicalName
       1(pk)     abc
       2         xyx
       3         pqr
       ChildMID MedicalID Station Name
       1(pk)    1(fk)     bnb     mfk
       2        1         def     rwr
       3        2         re      wrw      
       RFMID  Doctorname
       1(pk)  mr.john
       2      mr.jack
       3      mr.jim
       PMID   Firstname LastNAme
       1(pk)  df         ere
       2      rwe        rwer
       3      rwr        fwr
       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正在重复)

Njg,只是为了说明为什么医生的名字会重复,因为他们将访问多个患者,每个患者都会被该医生多次看到。因此,例如,对于一名医生看过3次的患者,他们将有3条“重复”行,因为medical_就诊表记录了3次单独的就诊

如果您只想显示每个患者的详细信息(姓名、姓氏、年龄、医院位置和医生),那么我首先会删除以下行:

INNER JOIN Medical_Visit ON Medical_Visit.VTID=Medical_Study.VTID
然后围绕依赖于该联接的其他表工作。看一看,看看会发生什么,您可能需要删除其他连接,直到您发现是什么复制了信息。在这种情况下,您可能需要在联接中使用子查询来减少来自表的重复,但首先要确定导致重复的表
(我不能用SQLFIDLE处理示例表。)

关于我能理解的内容,我有以下查询

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 | DATE

约翰先生

约翰先生

吉姆先生

所以,是的,根据你的数据,你得到约翰先生两次。我还看到,对于一个不同的人,你会得到两个不同的年龄。。。这有点典型。 您是否对您的数据进行了健全检查??我认为那里的某个地方出了问题…

试试下面的一个:

    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
运行此查询

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

虽然我不知道您想要的最终结果是什么,但下面的查询和解释可能有助于解决您的问题。有额外的样本数据和你想要的结果样本会很有帮助,但这里是我的尝试

我从一个较小的查询开始,然后开始添加表。第一个查询,它不会为您获取大量数据,但会为您获取最终产品的
ChildMID
MedicalId
站。您需要
ChildMID
MedicalId
来连接更多表。():

下一个表格中,我将
Medical\u研究
表格添加到了您刚刚从上一次加入中获得的
ChildMID
。这将为您的最终产品()提供
UID

在下一个join中,我添加了
Study\u Master
表。在这里,我做了一些稍微不同的事情,在两个单独的字段上加入了表。对于这个查询,我加入了
SMID
字段以验证研究是否正确,但我也加入了
MedicalID
字段以确保它使用了正确的病历。(请参阅)如果您没有同时加入这两个字段,那么您将在
医学研究
中获得每个项目的一条记录,但您似乎希望项目与研究和医学都匹配

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
下一个查询要简单一些,因为您要添加
医疗就诊
患者主诊
。()

要添加的最后一个表是
Doctor\u Master
,它将为您提供医生的姓名。()使用添加
Doctor\u Master
表之前提供的样本数据,您有一条记录,但最后有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

我认为这会产生你想要的结果

构建复杂查询可能并不总是最佳解决方案。使用联接需要对需要左/右/完全内部/外部联接的位置进行很好的控制,以获得所需的结果

复杂查询的一个缺点是,除了创建需要时间外,您将永远无法在以后理解,维护将是一场噩梦

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

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


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

不同的蓝脚怪会尝试解决这个问题。您只想返回最近一次访问的信息吗?现在您正在报告所有访问,这导致您的数据重复。仍然无法理解您到底想要什么?@John根据上面的样本数据,您能显示预期结果吗?您的预期结果是什么?你到底需要哪种类型的查询?回答得好。如果他想知道某个医生的名字