如果我有两张桌子
CREATE TABLE R
(
a int,
b int
);
CREATE TABLE S
(
b int,
c int,
d int
);
INSERT INTO R
VALUES (3,1),(2,3),(2,0),(3,3),(1,1);
INSERT INTO S
VALUES (2,2,3),(3,0,0),(1,3,3),(2,2,0);
然后我做R outer join S
。我想弄清楚结果。如果我尝试使用sql代码,我会这样做:
SELECT r.a,r.b,s.c,s.d
FROM R r
LEFT JOIN S s ON r.b=s.b
UNION
SELECT r.a,r.b,s.c,s.d
FROM R r
RIGHT JOIN S s ON r.b=s.b
该查询的结果是:
A B C D
3 1 3 3
2 3 0 0
2 0 - -
3 3 0 0
1 1 3 3
- - 2 3
- - 2 0
如果我试着手动解决它:
3 1
与1 3 3
匹配
2 3
与3 0 0
匹配
2 0
与- - -
匹配
3 3
与3 0 0
匹配
1 1
与1 3 3
匹配
这使得该结果中的前5行成为可能。剩下的两行来自右连接。但我不明白为什么正确的联接产生
- - 2 3
- - 2 0
因为在左侧加入时,2 0
与任何内容都不匹配,但b
列已保留,0就在那里。
但是在右边加入时,2 2 3
和2 2 0
与任何内容都不匹配,但b列变为空。不应该像左边的连接一样保留b列吗?
谁能解释一下这里发生了什么?
感谢。
答案 0 :(得分:0)
这是因为你要求的r.b不存在。请改用s.b.实施例
SELECT r.a,r.b,s.c,s.d
FROM R r
LEFT JOIN S s ON r.b=s.b
UNION
SELECT r.a,s.b,s.c,s.d
FROM R r
RIGHT JOIN S s ON r.b=s.b
答案 1 :(得分:0)
您RiGHT JOIN
查询中的原因是您获得了
- - 2 3
- - 2 0
记录是因为当你特别要求它时
当您执行正确的连接时,您要求右侧的参数表(在您的情况下为S
)中的所有记录,以及左侧参数表(在您的情况下为R
)中的匹配行。如果不存在这样的匹配,则左侧记录将被替换为空值。
看一下this SO帖子。
答案 2 :(得分:0)
回答Omega关于外连接的问题:
严格地说,在RA中,没有外连接这样的东西。因为您必须在结果中为“缺失”属性添加空值。
但如果你坚持,请转到'{full outer join'上的http://en.wikipedia.org/wiki/Relational_algebra。在所有不匹配的属性下都有一张显示空值的图片。
现在你必须涉及所有可能为null的值的机制,以及如何处理提及它们的选择。你不需要头痛。