3

医学_硕士

       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

医学_研究

       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

博士_硕士

       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

学习_硕士

       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 个表上使用了内部联接,但没有得到正确的数据。(医生姓名重复)

4

6 回答 6

3

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

我从一个较小的查询开始,并设法添加表。第一个查询,这不会为您提供大量数据,但会为您提供ChildMID,MedicalIdStation最终产品。你需要ChildMIDandMedicalId来加入更多的表。(SQL 小提琴):

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表格。在这里,我做了一些稍微不同的事情,因为我在两个单独的字段上加入了表格。对于这个查询,我加入了两个SMID字段以验证研究是否正确,但我也加入了MedicalID字段以确保它使用了正确的医疗记录。(请参阅SQL Fiddle)如果您不在两个字段上加入,那么您将获得每个项目的一条记录,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_VisitPatient_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_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

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

于 2012-08-09T12:58:06.397 回答
2

Njg,只是为了说明这一点,医生的名字会重复的原因是他们将访问不止一位患者,并且每位患者都会被一位医生多次看诊。例如,对于一位医生看过 3 次的患者,他们将有 3 条“重复”行,因为 medical_visit 表记录了 3 次单独的就诊。

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

INNER JOIN Medical_Visit ON Medical_Visit.VTID=Medical_Study.VTID

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

于 2012-07-31T14:20:35.497 回答
1

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

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

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

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

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

于 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.姓氏|##| v.AGE |##| m.MEDICALNAME |##| u.DESCRIPTION |##| c.站 |##| s.DATE |##| a.医生姓名

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

6 |##| 3 |##| rwr |##| 固件 |##| 45 |##| ABC |##| df |##| 定义 |##| rgr |##| 约翰先生

2 |##| 2 |##| rwe |##| rwer |##| 45 |##| xyx |##| ddf |##| 回复 |##| kdf |##| 吉姆先生

所以,是的,根据你的数据,你得到了 mr.john 2 次。我还看到,对于不同的人,你会得到 2 个不同年龄的……这有点典型。您是否对数据进行了完整性检查?我认为那里的某个地方出了问题...

于 2012-08-03T15:10:56.740 回答