SQL 中的自加入 ON 子句

self join ON clause in SQL

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

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 子句让我对输出感到困惑。在给定条件

的情况下,这个 table 究竟是如何自连接的
p1.x != p2.y

在上面的代码中?

如果你能理解'ON'中提到的条件是什么决定了table的连接方式那么就更容易理解了,在这种情况下条件是(加入table 的 x 值表示为 p1,其中它不等于相同 table 的 y 表示为 p2),例如,如果您考虑 p1 中 x 的值 -1,则存在值例如 0, -2 for y in same table denoted as p2 所以你的行从 p1 table 其中 x 值为 -1 被映射到相同的 table 表示为 p2 where y 值是 0、-2,因为这是条件规定的。

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

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

您的 table 有三行:

 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 <> 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