0
Mysql沒有FULL OUTER
連接,我知道有辦法可以emulate them using right and left joins。但是,我遇到的所有建議方法都需要引用要連接兩次的表。如果我正在使用大型子查詢,則無法兩次引用該查詢,因爲mysql不支持CTE。有沒有其他方法可以構建這個查詢,而不涉及複製和粘貼我的大型子查詢?在mysql中模擬一個嵌套查詢的完整外連接
Mysql沒有FULL OUTER
連接,我知道有辦法可以emulate them using right and left joins。但是,我遇到的所有建議方法都需要引用要連接兩次的表。如果我正在使用大型子查詢,則無法兩次引用該查詢,因爲mysql不支持CTE。有沒有其他方法可以構建這個查詢,而不涉及複製和粘貼我的大型子查詢?在mysql中模擬一個嵌套查詢的完整外連接
因此,假設我想效仿
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一次。
反對創建臨時表,將子查詢加載到該表,索引如有必要,然後右/左連接? – Twelfth
我的第一個反應是「使用通用表表達式」,但MySql [不支持它們](http://stackoverflow.com/questions/324935/mysql-with-clause)。所以可能你應該切換到臨時表。 – davidhigh
@Twelfth如果你建議使用'TEMPORARY'表,MySQL對它們的使用有限制,幾乎總是最終需要爲此目的創建兩個副本。然而,假的臨時表(即你完成時丟棄的表)工作得相當好,並且可以給出在使用之前能夠向中間數據添加適當索引的有利選擇。 – Uueerdo