我很难理解为什么输出是这种自我连接的方式。我要处理的表的代码是:
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
在上面的代码中?
答案 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