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根据上面的样本数据,您能显示预期结果吗?您的预期结果是什么?你到底需要哪种类型的查询?回答得好。如果他想知道某个医生的名字