0

如果我有两张桌子

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 3and2 2 0与任何内容都不匹配,但 b 列变成了空值。不应该像左连接一样保留 b 列吗?

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

谢谢。

4

3 回答 3

1

要回答 Omega 关于外连接的问题:

严格来说,在 RA 中,没有外连接这样的东西。因为您必须在“缺失”属性的结果中添加空值。

但是,如果您坚持,请访问http://en.wikipedia.org/wiki/Relational_algebra上的“完全外部连接”。在所有不匹配的属性下,有一张图片显示了各种不同的空值。

现在您必须涉及所有可能为空值的机制,以及如何处理提及它们的选择。你只是不需要头痛。

于 2014-02-17T20:28:07.427 回答
0

这是因为您要求的 rb 不存在。改用 sb。例子

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
于 2014-01-27T07:12:39.307 回答
0

在你的RiGHT JOIN查询中你得到的原因

-   -   2   3
-   -   2   0

记录是因为当你特别要求它。
当您执行右连接时,您将要求右侧参数表中的所有记录(S在您的情况下),以及左侧参数表中的匹配行(R在您的情况下)。如果不存在这样的匹配,则左侧记录将被空值替换。

看看这个SO 线程。

于 2014-01-27T07:14:52.297 回答