2011-08-24 76 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