5

我刚刚开始了解 NATURAL JOIN,而 SQLite 并没有像我预期的那样表现。

SELECT * FROM r1 NATURAL JOIN (r2 NATURAL JOIN r3);

SELECT * FROM (r1 NATURAL JOIN r2) NATURAL JOIN r3;

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

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

SELECT * FROM r1 NATURAL JOIN r2 NATURAL JOIN r3;

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

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

4

1 回答 1

5

我自己不使用那个数据库,但是根据这个文档,SQLite 中的所有连接都是基于左右表的笛卡尔积。

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

一点建议:最好了解 a 的NATURAL JOIN工作原理,以防您在代码中看到它,但不要自己使用它。这是一个没有什么价值的“危险”结构。只是我的观点。

于 2012-11-24T21:26:06.783 回答