【问题标题】:How left joins and right joins work in relational algebra左连接和右连接如何在关系代数中工作
【发布时间】: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 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列吗?

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

谢谢。

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

      这是因为您要求的 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
      

      【讨论】:

      • 但是在关系代数中(不是在sql中),是选择r.b还是s.b
      【解决方案3】:

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

      -   -   2   3
      -   -   2   0
      

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

      看看this SO 线程。

      【讨论】:

      • 但是在关系代数中,如果你只是做了R outer join S,结果会是什么样子? (如果是 r.b 或 s.b,您如何选择)?
      • @Omega 结果将是LEFTRIGHT JOINS 的联合。很像你的查询。这些行是联合中的RIGHT JOIN 部分。
      • 但是在右连接中,我可以选择 s.b 或 r.b,我碰巧选择了 r.b,它给出了一个空值,如果我放 s.b 它就不会是空值。这两个在 sql 中都是有效的,但我不明白哪个只用于关系代数......
      • 当您使用OUTER JOIN 时,它是对称的,两者都会被选中。将执行LEFT RIGHT 连接(因此是UNION)。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-10
      • 2020-07-28
      相关资源
      最近更新 更多