【发布时间】: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