【发布时间】:2014-02-17 22:29:33
【问题描述】:
如果我有两张桌子
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列吗?
谁能解释一下这里发生了什么?
谢谢。
【问题讨论】:
标签: sql left-join outer-join relational-algebra right-join