【问题标题】:self join ON clause in SQLSQL中的自连接ON子句
【发布时间】:2018-11-06 19:39:51
【问题描述】:

我无法理解为什么输出是这种自联接的方式。我正在处理的表的代码是:

create table point_2d (x INT, y INT);
insert into point_2d values (-1, -1);
insert into point_2d values (0,0);
insert into point_2d values (-1, -2);

我想按如下方式执行自连接:

SELECT *
FROM
point_2d p1
Inner JOIN
point_2d p2
ON p1.x != p2.y;

让我对输出感到困惑的是 ON 子句。在给定条件的情况下,这张表究竟是如何自连接的

p1.x != p2.y

在上面的代码中?

【问题讨论】:

  • 嗨。这种自联接正在做每个联接所做的事情,它只是在 2 个输入值相同时才会这样做。这里的答案如何不会重复对 join 如何工作的另一种描述?你能把你的问题说得更具体一点吗?为什么说“令人困惑”,与输入表值不同而不是相同且不混淆相比,您有什么困惑?在链接中查看我的答案。
  • 我的理解是自连接会横向连接一个表。但是在这种情况下,ON 子句不是基于两个表之间的共享属性。那么在没有共享属性的情况下,这个表是如何连接的呢?
  • 我不知道你这里的“横向”是什么意思。再说一次,你不是在解释自己,你只是在误用一些词来懒得说出你的意思。阅读 join on 的定义。它只是交叉连接和位置。行的每个组合都是由每个输入表值中的一行组成的,无论是通过表名还是子查询给出,并且满足条件的将被保留。自联接也不例外,只是当 2 个输入是相等的表值时。 (见我的链接和this one)。请通过帖子编辑而不是 cmets 进行澄清。
  • PS 而且我不知道您所说的“不基于两个表之间的共享属性”是什么意思。您的意思是,不是由表引用的相等性的组合组成,其中每个相等性的引用具有相同的列但别名不同?如果是这样,那又如何?为什么不那么基础是一个问题?

标签: sql inner-join self-join


【解决方案1】:

在某些数据库中,!= 运算符的写法类似于 , 查询将是相同的

SELECT *
FROM
point_2d p1
Inner JOIN
point_2d p2
ON p1.x <> p2.y;

如果你不喜欢使用显式连接,你也可以这样使用

SELECT *
FROM
point_2d p1, point_2d p2
WHERE p1.x <> p2.y

但我更喜欢第一种方式,因为它更明确,我认为您可以更好地阅读查询

如果您有疑问,我为您找到了 SQL 中使用的运算符列表 https://www.w3schools.com/sql/sql_operators.asp

【讨论】:

  • 在这里我找到了自联接 w3schools.com/sql/sql_join_self.asp 的文档,但是我记得几年前我在 oracle db 中使用了 SELF JOIN 指令,但现在我找不到文档
  • 但是,如果您愿意,您可以使用相同的语法进行多次插入:插入 point_2d 值 (-1, -1),(0,0),(-1, -2);
  • 不等于的标准语法是&lt;&gt;!= 是后来添加的,并非所有数据库都支持。
【解决方案2】:

如果你能理解“ON”中提到的条件决定了表的连接方式,那么就更容易理解了,在这种情况下,条件是(连接表的 x 值,表示为 p1其中它不等于表示为 p2 的同一表的 y),例如,如果您考虑 p1 中 x 的值 -1,那么在同一表中存在诸如 0、-2 之类的值,表示为 p2,因此您的p1 表中 x 值为 -1 的行被映射到表示为 p2 的同一表,其中 y 值为 0、-2,因为这就是条件状态。

【讨论】:

    【解决方案3】:

    您的表格有三行:

     x   y
    -1  -1
     0   0
    -1, -2
    

    join 是笛卡尔积的子查询。所以它是以下的一个子集:

    x1  y1       x2  y2
    -1  -1       -1  -1
    -1  -1        0   0    <-- p1.x <> p2.y
    -1  -1       -1  -2    <-- p1.x <> p2.y
     0   0       -1  -1    <-- p1.x <> p2.y
     0   0        0   0
     0   0       -1  -2    <-- p1.x <> p2.y
    -1, -2       -1  -1
    -1, -2        0   0    <-- p1.x <> p2.y
    -1, -2       -1  -2    <-- p1.x <> p2.y
    

    您的条件是p1.x &lt;&gt; p2.y。这些都显示在结果中。

    所以结果是:

    x1  y1       x2  y2
    -1  -1        0   0
    -1  -1       -1  -2
     0   0       -1  -1
     0   0       -1  -2
    -1, -2        0   0
    -1, -2       -1  -2
    

    【讨论】:

      猜你喜欢
      • 2012-10-19
      • 1970-01-01
      • 2011-09-16
      • 1970-01-01
      • 2011-02-25
      • 2021-04-22
      • 2012-04-18
      • 1970-01-01
      • 2017-03-20
      相关资源
      最近更新 更多