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个表上使用内连接但没有获得正确的数据。(医生名称重复)
答案 0 :(得分:3)
虽然我不确切地知道您对最终结果的要求,但下面的查询和说明可能有助于解决您的问题。拥有额外的样本数据和您想要的结果样本会有所帮助,但这是我的尝试。
我从较小的查询开始,并努力添加表格。第一个查询,这不会为您提供大量数据,但会为您的最终产品提供ChildMID
,MedicalId
和Station
。您需要ChildMID
和MedicalId
来加入更多表格。 (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_Master
和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
。 (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