2011-08-24 75 views
2

我试图做一个完整的外部,以检查哪个ID都包含在这两个/只表的一个连接两个表在MS Access CMVSCTOXOSC的:MS Access完全外部连接中令人费解的行为?

(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  CMV_NEGDATE CMV_POSDATE 
10245 04.02.2010 28.06.1999 
10642 08.10.1998 05.09.1991 

前几个记录TOXOSC(按升序编号的顺序排列)是:

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的记录一样。

这怎么可能?

回答

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); 
+0

我没想到'UNION'忽略列标识符。这是标准的SQL92行为还是访问权限? – blubb

+0

这是标准。 'UNION'不使用列标识符,但列列表的顺序(以及除第一个子查询之外的任何标题都被忽略)。 –

+2

@Simon Stelling:SQL-92 provides [[UNION CORRESPONDING']](http://books.google.co.uk/books?id=406_pJtiJ6sC&pg=PA119&dq=%22SQL+and+Relational+Theory%22+%22How+对于您期望的行为,您可以为+写入+准确+ SQL +代码%22 +%22union +对应%22&hl = en&ei = IvZUTuDrHMjAtAa0oKn2Dw&sa = X&oi = book_result&ct = result&resnum = 1&ved = 0CCsQ6AEwAA#v = onepage&q&f =不用说,Access团队还没有实现它:( – onedaywhen