我尝试在MS Access中对两个表CMVSC
和TOXOSC
进行完全外连接,以便检查两个/只有一个表中包含哪些ID:
(SELECT * FROM CMVSC LEFT JOIN TOXOSC ON CMVSC.ID = TOXOSC.ID)
UNION
(SELECT * FROM TOXOSC LEFT JOIN CMVSC ON TOXOSC.ID = CMVSC.ID);
可以执行查询,但不会产生我期望的结果。
CMVSC中的前几条记录(按升序ID排序)为:
ID CMV_NEGDATE CMV_POSDATE
10245 04.02.2010 28.06.1999
10642 08.10.1998 05.09.1991
TOXOSC中的前几条记录(按升序ID排序)为:
ID TOXO_NEGDATE TOXO_POSDATE
10120 22.11.1993 05.04.1991
10261 09.02.1998 23.02.1996
以下是上述查询的前两条记录:
CMVSC.ID CMV_NEGDATE CMV_POSDATE TOXOSC.ID TOXO_NEGDATE TOXO_POSDATE
10120 22.11.1993 05.04.1991
10245 04.02.2010 28.06.1999
请注意TOXOSC
的记录如何分配到CMV*
变量,就像来自CMVSC
的记录一样。
这怎么可能?
答案 0 :(得分:4)
原因是第一个子查询首先是CMVSC
表,然后是TOXOSC
表。第二个子查询的顺序相反。 UNION
在它们到来时获取列,并使用第一个子查询中的标题作为列标题(因此混合)。试试这个:
( SELECT CMVSC.*, TOXOSC.* FROM CMVSC LEFT JOIN TOXOSC ON CMVSC.ID = TOXOSC.ID)
UNION
( SELECT CMVSC.*, TOXOSC.* FROM TOXOSC LEFT JOIN CMVSC ON TOXOSC.ID = CMVSC.ID);
另一种方法是同时使用LEFT
和RIGHT
加入:
(SELECT * FROM CMVSC LEFT JOIN TOXOSC ON CMVSC.ID = TOXOSC.ID)
UNION
(SELECT * FROM CMVSC RIGHT JOIN TOXOSC ON TOXOSC.ID = CMVSC.ID);