使用左连接和右连接代替全连接 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)左连接和右连接来获得全连接的结果。

 

 

 

 

 

 

    

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