这是来自我的数据库的真实结果。我花了一些时间尝试使用 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) 行计数每次都是一致且可重复的。在我创建的一些示例中,向同一个表添加第二个自然连接两次会产生相同数量的行(正如我所期望的)。那么上面的结果怎么可能呢?
基本上,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您自己选择的列来解决此问题。
| 归档时间: |
|
| 查看次数: |
1127 次 |
| 最近记录: |