在这种情况下,SQLServerFullJoin如何返回额外的一行?

eivnm1vs  于 2021-07-24  发布在  Java
关注(0)|答案(4)|浏览(362)

简单架构:

CREATE TABLE T (A INT, B INT)

表中插入了5行:

INSERT INTO T VALUES (1,1), (2, NULL), (NULL, 3), (4,4), (5,5);

下面的查询返回6行,而我认为它只返回5行:

SELECT * FROM T X FULL JOIN T Y ON X.A = Y.A;

结果:

|      A |      B |      A |      B |
|--------|--------|--------|--------|
|      1 |      1 |      1 |      1 |
|      2 | (null) |      2 | (null) |
| (null) |      3 | (null) | (null) |
|      4 |      4 |      4 |      4 |
|      5 |      5 |      5 |      5 |
| (null) | (null) | (null) |      3 |

为什么会这样?最后一行怎么还回来的?

zzlelutf

zzlelutf1#

在您的表中有这一行:

NULL 3

在这种情况下:

ON X.A = Y.A

不匹配表的任何其他行。
在这种情况下,自我 FULL join从第一个副本返回1行( X )结果的三维行:

(null) |      3 | (null) | (null)

(最后2个) null 列表示行不匹配)
第二份的另一行( Y )在结果的第6行表格中:

(null) | (null) | (null) |      3

(前2页) null 列表示行不匹配)

pbgvytdp

pbgvytdp2#

记录 (NULL, 3) 未与中的任何值匹配 X . 因为这是一个 FULL JOIN ,两个表中的所有记录至少返回一次,即使它们不匹配。

vuv7lop3

vuv7lop33#

您必须了解完整的外部连接:
完全外部联接返回匹配的行,这些行通常是从内部联接返回的;加上左边没有匹配项的行,右边用空值作为占位符;加上右边没有匹配项的行,左边用空值作为占位符。需要完全外部联接并不常见,因为表之间的大多数关系只允许其中一方有与另一方不匹配的行,在这种情况下,需要单侧外部联接。

d7v8vwbk

d7v8vwbk4#

full join关键字返回两个表中所有匹配的记录,无论另一个表是否匹配。因此,如果“x”中有行在“y”中没有匹配项,或者“y”中有行在“x”中没有匹配项,那么这些行也将列出。
在sql中,null不等于null,因此x.a=y。如果a为null,则条件不为true,这是t的第三行。

相关问题