2015-05-14 17 views
0

Mysql沒有FULL OUTER連接,我知道有辦法可以emulate them using right and left joins。但是,我遇到的所有建議方法都需要引用要連接兩次的表。如果我正在使用大型子查詢,則無法兩次引用該查詢,因爲mysql不支持CTE。有沒有其他方法可以構建這個查詢,而不涉及複製和粘貼我的大型子查詢?在mysql中模擬一個嵌套查詢的完整外連接

+0

反對創建臨時表,將子查詢加載到該表,索引如有必要,然後右/左連接? – Twelfth

+0

我的第一個反應是「使用通用表表達式」,但MySql [不支持它們](http://stackoverflow.com/questions/324935/mysql-with-clause)。所以可能你應該切換到臨時表。 – davidhigh

+0

@Twelfth如果你建議使用'TEMPORARY'表,MySQL對它們的使用有限制,幾乎總是最終需要爲此目的創建兩個副本。然而,假的臨時表(即你完成時丟棄的表)工作得相當好,並且可以給出在使用之前能夠向中間數據添加適當索引的有利選擇。 – Uueerdo

回答

0

因此,假設我想效仿

SELECT * FROM A OUTER JOIN B USING(x) 

隨着表

A      B 
x  y    x  z 
---------    -------- 
1  2    1  Q 
3  3    2  P 
6  11    3  R 

所以要開始,我們做了LEFT JOIN它創建表

A LEFT JOIN B 
x y z 
------------- 
1 2 Q 
3 3 R 
6 11 NULL 

現在,我們追加一個空表項如下:

(A LEFT JOIN B) UNION (SELECT NULL,NULL,NULL) 
x y z 
------------- 
1 2 Q 
3 3 R 
6 11 NULL 
NULL NULL NULL 

我們再附加一個空列使用相同的技術

B UNION (SELECT NULL, NULL) 
x  z 
--------------------------- 
1  Q 
2  P 
3  R 
NULL NULL 

到B,如果我們RIGHT JOIN這兩個表一起,我們會得到下面

((A LEFT JOIN B USING(x)) UNION (SELECT NULL,NULL,NULL)) RIGHT JOIN (B UNION SELECT NULL,NULL) USING (x) 
x y z1 z2 
------------------- 
1 2 Q  Q 
NULL NULL NULL P 
3 3 R  R 
6 11 NULL NULL 
NULL NULL NULL NULL 

哪,如果我們忽略列z1和額外的「NULL」行,與A和B的OUTER JOIN相同。要除去額外的行,您需要額外的WHERE語句。還要注意的是,這是基於NULL,而不是在你正在合併的列中顯示。

我仍然在研究SQL語法的細節,因爲mysql抱怨命名子查詢,但是操作順序在理論上是正確的,並且只能訪問表A一次。