使用左連接和右連接代替全連接 1 (2 張表,值唯一)

    MySQL 不支持 FULL OUTER JOIN,如果需要使用 FULL OUTER JOIN,可以使用 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 來模擬。這篇文章研究怎樣使用 LEFT OUTER JOIN 和 RIGHT OUTER JOIN 代替 FULL OUTER JOIN。

    因爲 PostgreSQL 支持 FULL OUTER JOIN,所以可以直接使用 FULL OUTER JOIN 來判斷結果是否正確。

1. 2 張表,值唯一的情況。

1.1. 創建測試表。

DROP TABLE IF EXISTS table1;

DROP TABLE IF EXISTS table2;

CREATE TABLE table1
(
    column_1 NUMERIC
);

INSERT INTO table1
VALUES (123);
INSERT INTO table1
VALUES (12);
INSERT INTO table1
VALUES (111);

CREATE TABLE table2
(
    column_2 NUMERIC
);

INSERT INTO table2
VALUES (123);
INSERT INTO table2
VALUES (12);
INSERT INTO table2
VALUES (23);

1.2 查看錶裏的內容

查詢 1-2-1: 查詢表 1 內容。

SELECT *
FROM table1 t1;

輸出 1-2-1:

123
12
111

查詢 1-2-2: 查詢表 2 內容。

SELECT *
FROM table2 t2;

輸出 1-2-2

123
12
23

1.3 鏈接查詢

查詢 1-3-1: 兩張表內連接。

SELECT *
FROM table1 t1
         INNER JOIN table2 t2 ON t1.column_1 = t2.column_2
ORDER BY column_1, column_2;

輸出 1-3-1:

12    12
123    123

解釋 1-3-1:INNER JOIN 只輸出滿足連接條件的行。(注:ON 後面的內容,在本文中稱之爲連接條件)

查詢 1-3-2: 兩張表左連接。

SELECT *
FROM table1 t1
         LEFT OUTER JOIN table2 t2 ON t1.column_1 = t2.column_2
ORDER BY column_1, column_2;

輸出 1-3-2:

12    12
111    
123    123

解釋 1-3-2: 左連接,左邊的表每一行都會輸出。右邊的表只輸出符合連接條件的行。可以這麼理解:左連接 = 內連接 + 左表不符合連接條件的行。

查詢 1-3-3: 兩張表右連接。

SELECT *
FROM table1 t1
         RIGHT OUTER JOIN table2 t2 ON t1.column_1 = t2.column_2
ORDER BY column_1, column_2;

輸出 1-3-3:

12    12
123    123
    23

解釋 1-3-3: 右連接,右邊的表每一行都會輸出。左邊的表只輸出符合連接條件的行。可以這麼理解:右連接 = 內連接 + 右表不符合連接條件的行。

查詢 1-3-4: 兩張表全連接。

SELECT *
FROM table1 t1
         FULL OUTER JOIN table2 t2 ON t1.column_1 = t2.column_2
ORDER BY column_1, column_2;

輸出 1-3-4:

12    12
111    
123    123
    23

解釋 1-3-4: 全連接,左邊的表每一行都會輸出,右邊的表每一行也都會輸出。可以這麼理解:全連接 = 內連接 + 左表不符合連接條件的行 + 右表不符合連接條件的行。

整理一下上面的解釋:

左連接 = 內連接 + 左表不符合連接條件的行
右連接 = 內連接 + 右表不符合連接條件的行
全連接 = 內連接 + 左表不符合連接條件的行 + 右表不符合連接條件的行

所以:
全連接 = 左連接 + 右連接 - 內連接

這篇文章的標題是使用左連接和右連接來代替全連接。如果在合併左連接和右連接的時候,可以將重複的行去掉,就可以得到全連接的結果了。剛好,UNION 提供了這樣的功能。

查詢 1-3-5: 使用 UNION 合併左連接和右連接。

SELECT *
FROM table1 t1
         LEFT OUTER JOIN table2 t2 ON t1.column_1 = t2.column_2
UNION
SELECT *
FROM table1 t1
         RIGHT OUTER JOIN table2 t2 ON t1.column_1 = t2.column_2
ORDER BY column_1, column_2;

輸出 1-3-5:

12    12
111    
123    123
    23

可以看出,輸出 1-3-4 和 1-3-5 完全相同。

 

總結:

在 2 張表、值唯一的情況下,可以聯合(UNION)左連接和右連接來獲得全連接的結果。

 

 

 

 

 

 

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章