一尘不染

SQLite自然联接坏了吗?

sql

我只是逐渐了解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?


阅读 131

收藏
2021-05-23

共1个答案

一尘不染

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

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

一点建议:NATURAL JOIN如果您在代码中看到了它,但不要自己使用它,那么最好了解一下它是如何工作的机制。这是一个“危险的”构造,几乎没有价值。只是我的观点。

2021-05-23