简单架构:
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 |
为什么会这样?最后一行怎么还回来的?
4条答案
按热度按时间zzlelutf1#
在您的表中有这一行:
在这种情况下:
不匹配表的任何其他行。
在这种情况下,自我
FULL
join从第一个副本返回1行(X
)结果的三维行:(最后2个)
null
列表示行不匹配)第二份的另一行(
Y
)在结果的第6行表格中:(前2页)
null
列表示行不匹配)pbgvytdp2#
记录
(NULL, 3)
未与中的任何值匹配X
. 因为这是一个FULL JOIN
,两个表中的所有记录至少返回一次,即使它们不匹配。vuv7lop33#
您必须了解完整的外部连接:
完全外部联接返回匹配的行,这些行通常是从内部联接返回的;加上左边没有匹配项的行,右边用空值作为占位符;加上右边没有匹配项的行,左边用空值作为占位符。需要完全外部联接并不常见,因为表之间的大多数关系只允许其中一方有与另一方不匹配的行,在这种情况下,需要单侧外部联接。
d7v8vwbk4#
full join关键字返回两个表中所有匹配的记录,无论另一个表是否匹配。因此,如果“x”中有行在“y”中没有匹配项,或者“y”中有行在“x”中没有匹配项,那么这些行也将列出。
在sql中,null不等于null,因此x.a=y。如果a为null,则条件不为true,这是t的第三行。