Sql server 2008 用于4个表的SQL Server 2008联接类型

Sql server 2008 用于4个表的SQL Server 2008联接类型,sql-server-2008,join,Sql Server 2008,Join,我有一个由同事在MS Access中创建的患者实验室数据库,该数据库有4个表 表1包含患者人口统计信息(患者ID、性别、出生日期等) 表2包含类型1(血压、心率) 表3包含类型2(化学组、血红蛋白等) 表4包含类型3(微生物培养结果) 每个表都有一个共同的内部患者编号。每一项措施都可以独立于其他措施而采取,可能有结果,也可能没有结果。我想要的是一个简单的表格,其中包含一个外部患者ID、性别和DOB(仅在表1中找到),以及其他每个表格的结果日期。我尝试使用正确的联接,当后续表中的日期不匹配时,我希

我有一个由同事在MS Access中创建的患者实验室数据库,该数据库有4个表

表1包含患者人口统计信息(患者ID、性别、出生日期等)

表2包含类型1(血压、心率)

表3包含类型2(化学组、血红蛋白等)

表4包含类型3(微生物培养结果)

每个表都有一个共同的内部患者编号。每一项措施都可以独立于其他措施而采取,可能有结果,也可能没有结果。我想要的是一个简单的表格,其中包含一个外部患者ID、性别和DOB(仅在表1中找到),以及其他每个表格的结果日期。我尝试使用正确的联接,当后续表中的日期不匹配时,我希望会有“null”值。相反,我有一个看起来像交叉表查询的结果,每一行都有一个值。显然,我没有正确理解连接的用法。这就是我所尝试的:

SET DATEFORMAT dmy
DECLARE @time time(0)

Select DISTINCT
P.PATIENT_ID as 'Patient ID',
P.SEX as 'Sex',
CONVERT(VARCHAR(11),P.DOB) as 'DOB',
CONVERT(VARCHAR,TYPE1.DateTime,101)as 'BP Measure DATES',
CONVERT(VARCHAR,TYPE2.DateTime,101) as 'CHEM Measure DATES',
CONVERT(VARCHAR,TYPE3.DateTime,101) as 'MICRO Measure DATES'
From dbo.PATIENT as P LEFT JOIN dbo.BRACHIALBPS as TYPE1 on P.PATIENT_NO=TYPE1.PATIENT_NO
Right Join dbo.Chemistries as TYPE2 on P.PATIENT_NO=TYPE2.PATIENT_NO
Right Join dbo.Microbiologies as TYPE3 on P.PATIENT_NO=TYPE3.PATIENT_NO
ORDER BY P.PATIENT_ID
我正在使用SQL Server 2008导入数据并执行查询

正如我提到的,我希望每个患者/每个结果日期有一行。 但每次约会组合我都会得到多行


提前感谢您的指导

请尝试以下版本的查询:

SET DATEFORMAT dmy
DECLARE @time time(0)

Select DISTINCT
    P.PATIENT_ID as 'Patient ID',
    P.SEX as 'Sex',
    CONVERT(VARCHAR(11),P.DOB) as 'DOB',
    CONVERT(VARCHAR,TYPE1.DateTime,101)as 'BP Measure DATES',
    CONVERT(VARCHAR,TYPE2.DateTime,101) as 'CHEM Measure DATES',
    CONVERT(VARCHAR,TYPE3.DateTime,101) as 'MICRO Measure DATES'
From 
    dbo.PATIENT as P 
    LEFT JOIN dbo.BRACHIALBPS as TYPE1 
        on P.PATIENT_NO=TYPE1.PATIENT_NO
    LEFT Join dbo.Chemistries as TYPE2 
        on P.PATIENT_NO=TYPE2.PATIENT_NO
    LEFT Join dbo.Microbiologies as TYPE3 
        on P.PATIENT_NO=TYPE3.PATIENT_NO
ORDER BY 
    P.PATIENT_ID
右连接被左连接替换

当查询中有
右键将dbo.BRACHIALBPS作为TYPE1连接到p.PATIENT_NO=TYPE1.PATIENT_NO
时,它“告诉”数据库引擎将
dbo.BRACHIALBPS中的所有适用(未过滤)行作为TYPE1
表,并尝试在表中查找匹配行
dbo.PATIENT作为p
-如果未找到匹配,请填写对于带有空值的特定结果记录,表
P
的“缺少字段”

使用左联接将把
dbo.PATIENT的优先级定为p
,因此联接过程中的行首先从此表中获取,然后尝试在左联接表
dbo.BRACHIALBPS中找到匹配项,作为TYPE1
。同样,如果没有匹配项,则查询结果中的
TYPE1
中的“缺失字段”将填充为NULL

这里有一个有趣的线程,其中对连接进行了非常详细的解释,并且从很多方面进行了解释-请查看:


我希望我正确地理解了这个问题,它至少有一点帮助。

在这方面做得更多一些,我使用临时表并加入它们以获得我需要的结果。不确定是否有更好或更有效的方法,但它起到了作用。如果对我所做的有任何评论或担忧,我希望听到他们的意见

SET DATEFORMAT dmy
DECLARE @time time(0)

Select DISTINCT 
PATIENT.PATIENT_ID as 'PatientID',
PATIENT.SEX as 'Sex',
CONVERT(VARCHAR(11),PATIENT.DOB) as 'DOB'
INTO #PAT
From PATIENT

SELECT DISTINCT
P.PATIENT_ID as 'PatientID',
CONVERT(VARCHAR,TYPE1.DateTime,101)as 'BP Measure DATES'
INTO #BP
FROM dbo.PATIENT as P Inner JOIN dbo.BRACHIALBPS as TYPE1 on P.PATIENT_NO=TYPE1.PATIENT_NO

SELECT DISTINCT
P.PATIENT_ID as 'PatientID',
CONVERT(VARCHAR,TYPE2.DateTime,101) as 'CHEM Measure DATES'
INTO #CHEM
FROM dbo.PATIENT as P Inner JOIN dbo.Chemistries as TYPE2 on P.PATIENT_NO=TYPE2.PATIENT_NO

SELECT DISTINCT
P.PATIENT_ID as 'PatientID', 
CONVERT(VARCHAR,TYPE3.DateTime,101) as 'MICRO Measure DATES'
INTO #MIC
From dbo.PATIENT as P Inner JOIN dbo.Microbiologies as TYPE3 on P.PATIENT_NO=TYPE3.PATIENT_NO

SELECT DISTINCT
#PAT.PatientID,
#PAT.DOB,
#PAT.Sex,
#BP.[BP Measure DATES],
#CHEM.[CHEM Measure DATES],
#MIC.[MICRO Measure DATES]
FROM #PAT
Left JOIN #BP on #PAT.PATIENTID=#BP.PATIENTID
Left Join #CHEM on #PAT.PatientID=#CHEM.PatientID and #BP.[BP Measure DATES]=#CHEM.[CHEM Measure DATES]
Left Join #MIC on #PAT.PatientID=#MIC.PatientID and #BP.[BP Measure DATES]=#MIC.[MICRO Measure DATES]

谢谢你,T_G,我会投你一票,但作为一名牡丹,我还不能!这对我帮助很大。它比我原来的工作得更好,但我仍然需要对它进行更多的调整。当我单独运行每个查询时,每个查询集中我只有大约35个日期(类型1、类型2、类型3)。但是,当我按照您的建议运行查询时,我有174个结果。它仍在匹配匹配日期的所有可能变化。我认为我需要根据日期运行查询或加入子查询。但是,您肯定给了我一个移动的方向!没问题:)。但它确实帮助了您?我很高兴当时能帮上一点忙。如果我来的话我会写一些可能有用的东西。谢谢。