MS Access全外连接中的无法解释的行为?

时间:2011-08-24 11:42:38

标签: sql ms-access join outer-join

我尝试在MS Access中对两个表CMVSCTOXOSC进行完全外连接,以便检查两个/只有一个表中包含哪些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的记录一样。

这怎么可能?

1 个答案:

答案 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);

另一种方法是同时使用LEFTRIGHT加入:

(SELECT * FROM CMVSC LEFT JOIN TOXOSC ON CMVSC.ID = TOXOSC.ID)
UNION 
(SELECT * FROM CMVSC RIGHT JOIN TOXOSC ON TOXOSC.ID = CMVSC.ID);