我刚刚开始了解 NATURAL JOIN,而 SQLite 的行为并不像我预期的那样。
SELECT * FROM r1 NATURAL JOIN (r2 NATURAL JOIN r3);
and
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?
我自己不使用该数据库,但根据本文档 http://www.sqlite.org/lang_select.html#fromclause,SQLite中的所有连接都是基于左表和右表的笛卡尔积。
NATURAL
连接使用公共列名作为“键”来组合两个表。使用括号强制在处理外连接之前构建“派生表”。如果没有括号,它不会“看到”公共列名称,因此第二个NATURAL
关键字被忽略。
一点建议:最好了解一下NATURAL JOIN
如果您在代码中看到它,则可以使用它,但不要自己使用它。这是一个“危险”的结构,没有什么价值。只是我的观点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)