SQLite自然连接坏了吗?

时间:2012-11-24 20:52:13

标签: sql sqlite inner-join natural-join

我刚刚开始了解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?

1 个答案:

答案 0 :(得分:3)

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

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

一点建议:理解NATURAL JOIN如何工作的机制,以防你在代码中看到它,但不要自己使用它。这是一个“危险”的构造,价值不大。只是我的意见。