左边连接和右连接如何在关系代数中起作用

时间:2014-01-27 07:07:40

标签: sql left-join outer-join relational-algebra right-join

如果我有两张桌子

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 11 3 3匹配

2 33 0 0匹配

2 0- - -匹配

3 33 0 0匹配

1 11 3 3匹配

这使得该结果中的前5行成为可能。剩下的两行来自右连接。但我不明白为什么正确的联接产生

-   -   2   3
-   -   2   0

因为在左侧加入时,2 0与任何内容都不匹配,但b列已保留,0就在那里。

但是在右边加入时,2 2 32 2 0与任何内容都不匹配,但b列变为空。不应该像左边的连接一样保留b列吗?

谁能解释一下这里发生了什么?

感谢。

3 个答案:

答案 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的值的机制,以及如何处理提及它们的选择。你不需要头痛。