我刚刚阅读了自然连接/使用 - SQL92的功能,这些功能(遗憾地?)缺少SQL Server当前的功能。
有没有人来自支持SQL Server(或其他不支持的DBMS)的DBMS - 它们听起来有用,还是一堆蠕虫(听起来也可能!)?
答案 0 :(得分:15)
我从不使用NATURAL JOIN
,因为我不喜欢连接可能会做一些我不想做的事情,因为两个表中都存在一些列名。
偶尔会使用USING
连接语法,但事实证明我需要一个比USING
更加复杂的连接条件,因此我将其转换为等效的{{1毕竟语法。
答案 1 :(得分:8)
你会考虑一个真正关系的DBMS吗?
教程D中的[真正的关系 语言],唯一的“加入”运算符是 叫JOIN,意思是“自然的 加入“......应该没有别的 加入...很少有人拥有 使用正确的经验 关系语言。那些人 有,我强烈怀疑没有 他们曾经抱怨过一些人 在配对中感到不便 列根据其名称
来源:Hugh Darwen的“The Importance of Column Names”
答案 2 :(得分:2)
相关问题:is NATURAL JOIN any better than SELECT FROM WHERE in terms of performance ?
自然联接不是一个方便的捷径:它是彻头彻尾的危险。这在DBMS中非常罕见。
USING是明确的,但考虑到它的局限性,你无法在任何地方使用它,所以ON会保持一致,不是吗?
答案 3 :(得分:2)
这是方便的问题。 不是必不可少的,但它应该有它的位置,例如在交互式查询中(每次击键都让我们更接近RSI),或者甚至在生产代码中的一些简单的手写SQL案例< / em>(是的,我写过。甚至在严肃的代码中看过JOIN USING
,由我自己以外的明智的程序员编写。但是,我喜欢离题了。
我在找到SS缺少此功能的确认时发现了这个问题,我得到了它。我只是对这种语法的仇恨感到困惑,我将其归因于酸葡萄综合症。当用一种光顾的语气演讲时我感到很开心 Sweets (读:语法糖)对你的健康有害。无论如何,你根本不需要它。
JOIN USING
语法中的好处是,它不仅适用于列名称,还适用于列别名,例如:
-- foreign key "order".customerId references (customer.id)
SELECT c.*, c.id as customerId, o.* from customer c
join "order" o using (customerId);
我不同意&#34;加入使用会更好,如果只是(...)&#34; 。或者说,你可能需要更复杂的条件。从不同的角度来看,为什么要使用JOIN ON
?为什么不是纯粹的,并将所有条件移到WHERE
子句?
SELECT t1.*, t2.* from t1, t2 where t2.t1_id = t1.id;
我现在可以生气并争辩说,这是如何表达联接的最简洁方式,你可以立即开始在where子句中添加更多条件,无论如何你通常需要这样做,等等等等......
所以你不应该错过这种特殊的语法,但没有什么可以为没有它而感到高兴(&#34; Phew,那很接近。那么好不要加入了我。我没有多少痛苦&#34; )。
因此,虽然我个人在99%的时间内使用JOIN ON
,但在没有JOIN USING
或NATURAL JOIN
的情况下,我觉得没有Schadenfreude。
答案 4 :(得分:1)
我没有看到USING或NATURAL语法的价值 - 正如您所遇到的那样,只有ON始终如一,因此从可移植性的角度来看,它是最好的。
明确表示维护也更好,除了替代方案可能太有限而无法处理情况。我也希望我的代码库保持一致。