我刚刚开始了解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?
答案 0 :(得分:3)
我自己不使用该数据库,但根据this documentation,SQLite中的所有连接都基于左右表的笛卡尔积。
NATURAL
联接使用公共列名作为“键”来组合两个表。使用括号强制在处理外部联接之前构建“派生表”。如果没有括号,它就不会“看到”常见的列名,因此会忽略第二个NATURAL
关键字。
一点建议:理解NATURAL JOIN
如何工作的机制,以防你在代码中看到它,但不要自己使用它。这是一个“危险”的构造,价值不大。只是我的意见。