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

SQL Server 2008 Join type to use for 4 tables

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

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

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

Table 3 包含 Type2(化学面板、血红蛋白等)

Table 4个包含Type3(微生物培养结果)

每个 table 都有一个共同的内部患者编号。每项措施都可以独立于其他措施采取,并且可能有也可能没有结果。我想要的是一个简单的 table,它提取仅在 Table 1 中找到的外部患者 ID、性别和出生日期,并结合其他每个 table 的结果日期。我尝试使用 RIGHT 联接,并期望在后续 table 中没有日期匹配时会有 'null' 值。相反,我有一个看起来像交叉表查询的结果,每一行都有一个值。显然我没有正确理解 JOINS 的使用。这是我试过的:

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 导入数据并执行查询。

正如我提到的,我希望每个 patient/per 结果日期有一行。 但是我得到了每个日期组合的多行。

提前感谢您的指导!

请尝试以下版本的查询:

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

RIGHT 联接已替换为 LEFT 联接。

当查询中有 RIGHT JOIN dbo.BRACHIALBPS as TYPE1 on P.PATIENT_NO=TYPE1.PATIENT_NO 时,它 "told" 数据库引擎从 dbo.BRACHIALBPS as TYPE1 table 中获取所有适用的(未过滤掉的)行并尝试在 table dbo.PATIENT as P 中查找匹配行 - 如果未找到匹配项,则用 NULL 填充特定结果记录的 table P 的 "missing fields"。

使用左连接会优先 dbo.PATIENT as P 因此连接过程中的行首先取自此 table 然后尝试在左连接 table 中找到匹配项 dbo.BRACHIALBPS as TYPE1。同样,如果没有匹配项 - 查询结果中来自 TYPE1 的 "missing fields" 将填充 NULL。

SO 上有一个有趣的线程,其中从很多方面对 JOINS 进行了非常详细的解释 - 请查看:Difference between INNER and OUTER joins.

希望我对问题的理解是正确的,它至少有一点帮助。

在这方面做了更多的工作,我使用了临时表并加入它们以获得我需要的结果。不确定是否有更好或更有效的方法,但它有效。如果对我所做的有任何意见或疑虑,很想听听意见。

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]