与同一个表的额外自然连接如何两次*减少*行数

Mar*_*tus 3 postgresql

这是来自我的数据库的真实结果。我花了一些时间尝试使用 SSCCE 重现此行为,但失败了。下面的最后一个结果怎么可能?

SELECT COUNT(*) FROM rr.resource    a
--- 15771

SELECT COUNT(*) FROM rr.resource    a
NATURAL JOIN rr.interface   b
--- 41419

SELECT COUNT(*) 
FROM rr.resource    a
NATURAL JOIN rr.interface   b
NATURAL JOIN rr.interface   c
--- 0
Run Code Online (Sandbox Code Playgroud)

上次查询中的零 (0) 行计数每次都是一致且可重复的。在我创建的一些示例中,向同一个表添加第二个自然连接两次会产生相同数量的行(正如我所期望的)。那么上面的结果怎么可能呢?

Phi*_*lᵀᴹ 8

基本上,NULL是造成这种情况的原因,因为NULL<>NULL. 自联接表中的一列将全部为NULLs。

这是一个小测试案例,说明了为什么会发生这种情况。顽皮的NULL平等和NATURAL JOIN工作方式,选择列名称为您加入。

设置:

create table one ( a integer, b integer );

CREATE TABLE two ( A INTEGER , c integer);

insert into one values (1,1);

insert into two values (1,1);

insert into two values (1,null);

insert into two values(2,NULL);
Run Code Online (Sandbox Code Playgroud)

查询:

SELECT COUNT(*)
FROM ONE
NATURAL JOIN TWO tttt;

SELECT COUNT(*)
FROM ONE
NATURAL JOIN TWO tttt
NATURAL JOIN TWO ttttt;
Run Code Online (Sandbox Code Playgroud)

第一个查询将给出 2,第二个查询将给出 1。

您的问题只是更高级的版本。

使用JOIN .... USING您自己选择的列来解决此问题。