SQL中的自连接ON子句

时间:2018-11-06 06:54:51

标签: sql inner-join self-join

我很难理解为什么输出是这种自我连接的方式。我要处理的表的代码是:

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

在上面的代码中?

3 个答案:

答案 0 :(得分:0)

如果您可以理解'ON'中提到的条件是决定表联接方式的原因,那么它很容易理解,在这种情况下,条件是(联接表的x值表示为p1它不等于表示为p2的同一表的y,例如,如果您考虑p1中x的值-1,那么在表示为p2的同一表中存在y的值,例如0,-2 p1表中x值为-1的行被映射到同一表,其中p表示y值为0,-2,因为这就是条件所表示的。

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

您的表有三行:

 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