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
我无法理解为什么输出是这种自连接的方式。我正在处理的 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