我的情况:我有一个中央PI表(患者信息),用于存储数据库中的每个患者。然后我还有一些其他表格(例如生命体征,自我报告分数等)。问题是,并非每个患者都在每个表中完成测量。即,患者可能在生命体征表中有一个条目,但在自我报告表中没有。如何运行查询,其中显示PI表中的所有患者及其相应的生命体征和SR数据(如果存在),而不是将查询限制为仅显示在所有这三个表中都有记录的患者?
答案 0 :(得分:2)
我不清楚你为什么要FULL OUTER JOIN
。
您有一个 PI表,其中包含每位患者的一行。您有另一个表,如 SR数据,其中包含这些患者的自我报告数据。假设他们有一个共同的密钥...也许是 patient_id ... LEFT JOIN
将为每位患者提供一行,无论是否有 SR数据适用于该患者:
SELECT *
FROM
[PI table] AS pi
LEFT OUTER JOIN [SR Data] AS sr
ON pi.patient_id = sr.patient_id;
注意访问权限会对LEFT OUTER JOIN
或LEFT JOIN
感到满意。不需要OUTER
,但如果包含Access,Access将不会成为对象。
所以我认为你只需要一个LEFT JOIN
。如果 SR数据包含的行与 PI表中的任何现有患者不匹配,则只需要{相当于} FULL OUTER JOIN
并且您希望查询结果中包含那些不匹配的行。但是你并没有表明这适用于你的问题,所以除非你告诉我们,否则我会把它排除在外。
你可以LEFT JOIN
另一个表到第一个查询......
SELECT *
FROM
([PI table] AS pi
LEFT OUTER JOIN [SR Data] AS sr
ON pi.patient_id = sr.patient_id)
LEFT JOIN [Vital Signs] AS v
ON pi.patient_id = v.patient_id;
...并根据需要从那里扩展其他表。如果使用Access查询设计器来设置连接,它将正确添加括号,因为db引擎需要包含多个连接的任何查询。
答案 1 :(得分:1)
Access(不幸的是)不支持OUTER JOIN。它的作用是INNER,LEFT和RIGHT JOINS。
正如预期的那样,您只需要执行两个在两个方向上执行JOIN的查询,然后使用UNION将它们结合起来。这是一个漫长的过程,但这是唯一的方法!
SELECT * FROM
(SELECT table1.FieldName1, table2.FieldName2
FROM table1 RIGHT JOIN table2 ON table1.ID = table2.ID
UNION
SELECT table1.FieldName1, table2.FieldName2
FROM table1 LEFT JOIN table2 ON table1.ID = table2.ID)