我有一个由MS Access中的同事创建的患者实验室数据库,该数据库有4个表。
表1包含患者人口统计信息(患者ID,性别,DOB等)
表2包含Type1(血压,心率)
表3包含Type2(化学成分,血红蛋白等)
表4包含Type3(微生物学培养结果)
每个表都有一个共同的内部患者编号。每种措施都可以彼此独立地采取,可能有结果也可能没有结果。我想要一个简单的表,该表提取仅在表1中找到的外部患者ID,性别和DOB,并结合其他每个表的结果的DATE。我尝试使用RIGHT联接,并期望在后续表中的日期不匹配时为“ 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导入数据并执行查询。
正如我提到的那样,我希望每个患者/每个结果日期都有一行。但是对于每个日期组合,我都会得到多行。
在此先感谢您的指导!
请尝试以下版本的查询:
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
查询中存在时,它“告诉”数据库服务器从dbo.BRACHIALBPS as TYPE1
表中获取所有适用的(未筛选出的)行,并尝试在表中查找匹配的行dbo.PATIENT as P
-如果未找到匹配项,则填写P
带有NULL的特定结果记录的表格。
使用LEFTdbo.PATIENT as P
联接将确定优先级,因此联接过程中的行首先从该表中获取,然后尝试在左联接表中找到匹配项dbo.BRACHIALBPS as TYPE1
。同样,如果没有匹配项TYPE1
,则查询结果中的“缺少字段”将填充为NULL。
SO上有一个有趣的线程,在其中非常详细地解释了JOINS,并从很多方面进行了解释-请查看:INNER和OUTER joins之间的区别。
我希望我正确理解了这个问题,至少可以有所帮助。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句