SQLite 自然连接坏了?

Pan*_*sis 5 sql sqlite natural-join inner-join

我刚刚开始了解 NATURAL JOIN 并且 SQLite 并没有像我期望的那样运行。

SELECT * FROM r1 NATURAL JOIN (r2 NATURAL JOIN r3);
Run Code Online (Sandbox Code Playgroud)

SELECT * FROM (r1 NATURAL JOIN r2) NATURAL JOIN r3;
Run Code Online (Sandbox Code Playgroud)

产生相同(正确)的结果。

但是,如果我省略括号,如下所示:

SELECT * FROM r1 NATURAL JOIN r2 NATURAL JOIN r3;
Run Code Online (Sandbox Code Playgroud)

我看到 r1 和 r2 连接正确,但是 r3 根本没有连接到结果,而是形成了 r1 NATURAL JOIN r2, r3 的笛卡尔积。

第一个连接结果的属性名称是否存在问题,还是我误解了 SQL?

Bel*_*Bob 5

我自己不使用该数据库,但根据此文档,SQLite 中的所有连接均基于左右表的笛卡尔积。

NATURAL连接使用公共列名作为“键”来组合两个表。使用括号强制在处理外连接之前构建“派生表”。没有括号,它不会“看到”公共列名,所以第二个NATURAL关键字被忽略。

一个小建议:NATURAL JOIN如果您在代码中看到它,了解它的工作原理是很好的,但不要自己使用它。这是一个价值不大的“危险”构造。只是我的观点。