快速搜索網頁的顯示,模擬完全外部的主題JOIN(「FOJ」)在堆棧溢出或其他地方已經討論過很多次,但答案似乎都限制自己的情況只有兩張桌子。我懷疑這是因爲三個或多個表FOJ是
- 不是一個很普遍的現象,並
- 可能相當混亂。
不過,我想我給它一個去,這裏就是我想出了:
用於模擬FOJ最常提到的技術對兩個表是UNION ALL三種可能的情況下, :
In_Table2 In_Table1
--------- ---------
false true
true false
true true
或,用真= 1,假= 0
In_Table2 In_Table1
--------- ---------
0 1
1 0
1 1
這看起來像一個二位整數有三個POSS IBLE非零值,並且SQL提取那些可以是以下形式的
Table2 RIGHT JOIN Table1 WHERE Table2.something IS NULL
UNION ALL
Table2 LEFT JOIN Table1 WHERE Table1.something IS NULL
UNION ALL
Table2 INNER JOIN Table1
用於與三個表的情況下,因此看起來像一個三比特整數與七個可能的非零值
該狀態表
In_Table3 In_Table2 In_Table1
--------- --------- ---------
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1
我想做的加入上一個整數值,所以我只是分配給他們依次對每個七行
Table3 Table2 Table1
------ ------ ------
1
2
3 3
4
5 5
6 6
7 7 7
的,所以我的測試表是
[表1]
n txt
- ----
1 t1_1
3 t1_3
5 t1_5
7 t1_7
[表2]
n txt
- ----
2 t2_2
3 t2_3
6 t2_6
7 t2_7
[表3]
n txt
- ----
4 t3_4
5 t3_5
6 t3_6
7 t3_7
我創建了一個名爲[foj12]訪問已保存的查詢執行之間的FOJ [表1]和[表2]
SELECT t1.n AS t1_n, t1.txt AS t1_txt, t2.n AS t2_n, t2.txt AS t2_txt
FROM
Table1 t1
INNER JOIN
Table2 t2
ON t1.n = t2.n
UNION ALL
SELECT t1.n AS t1_n, t1.txt AS t1_txt, t2.n AS t2_n, t2.txt AS t2_txt
FROM
Table1 t1
LEFT JOIN
Table2 t2
ON t1.n = t2.n
WHERE t2.n IS NULL
UNION ALL
SELECT t1.n AS t1_n, t1.txt AS t1_txt, t2.n AS t2_n, t2.txt AS t2_txt
FROM
Table1 t1
RIGHT JOIN
Table2 t2
ON t1.n = t2.n
WHERE t1.n IS NULL
它返回
t1_n t1_txt t2_n t2_txt
---- ------ ---- ------
1 t1_1
2 t2_2
3 t1_3 3 t2_3
5 t1_5
6 t2_6
7 t1_7 7 t2_7
然後,我開始通過涉及案件[表3]工作。它們如下所示,並對應於下面的SQL語句中的「聯合」查詢。
- 表3同時匹配表1和表2(N = 7)
- 表3匹配表1但不表2(N = 5)
- 表3匹配表2,但不表1(N = 6)
- 行中表3中不表1表2或任何相匹配(N = 4)
- 行中FOJ(表1,表2)有什麼共同點與表3(N = 1,2,3)
SELECT f.t1_n, f.t1_txt, f.t2_n, f.t2_txt, t3.n AS t3_n, t3.txt AS t3_txt
FROM
Table3 t3
INNER JOIN
foj12 f
ON t3.n = f.t1_n AND t3.n = f.t2_n
UNION ALL
SELECT f.t1_n, f.t1_txt, f.t2_n, f.t2_txt, t3.n AS t3_n, t3.txt AS t3_txt
FROM
Table3 t3
INNER JOIN
foj12 f
ON t3.n = f.t1_n
WHERE f.t2_n IS NULL
UNION ALL
SELECT f.t1_n, f.t1_txt, f.t2_n, f.t2_txt, t3.n AS t3_n, t3.txt AS t3_txt
FROM
Table3 t3
INNER JOIN
foj12 f
ON t3.n = f.t2_n
WHERE f.t1_n IS NULL
UNION ALL
SELECT NULL, NULL, NULL, NULL, t3.n AS t3_n, t3.txt AS t3_txt
FROM
Table3 t3
WHERE t3.n NOT IN (SELECT t1_n FROM foj12 WHERE t1_n IS NOT NULL)
AND t3.n NOT IN (SELECT t2_n FROM foj12 WHERE t2_n IS NOT NULL)
UNION ALL
SELECT f.t1_n, f.t1_txt, f.t2_n, f.t2_txt, NULL, NULL
FROM foj12 f
WHERE
(f.t1_n NOT IN (SELECT n FROM Table3) AND f.t2_n NOT IN (SELECT n FROM Table3))
OR
(f.t1_n NOT IN (SELECT n FROM Table3) AND f.t2_n IS NULL)
OR
(f.t1_n IS NULL AND f.t2_n NOT IN (SELECT n FROM Table3))
ORDER BY 5, 3, 1
個
那小美女回報
t1_n t1_txt t2_n t2_txt t3_n t3_txt
---- ------ ---- ------ ---- ------
1 t1_1
2 t2_2
3 t1_3 3 t2_3
4 t3_4
5 t1_5 5 t3_5
6 t2_6 6 t3_6
7 t1_7 7 t2_7 7 t3_7
(不用說,我沒興趣增加了第四個表! :)
評論歡迎。
你試過了嗎?你怎麼看 ? –