我认为ANSI092标准包含了一些相当丑陋的语法。自然连接是其中之一,USING从句是另一个。在我看来,向表中添加列不应该破坏代码,但自然连接会以最恶劣的方式破坏代码。"最好"的破坏方式是编译错误。例如,如果你在某个地方使用SELECT *,添加列可能无法编译。接下来最好的失败方式是运行时错误。它更糟糕,因为你的用户可能会看到它,但它仍然会给你一个很好的警告,说明你已经破坏了某些东西。如果你使用ANSI92并编写带有自然连接的查询,它不会在编译时破坏,也不会在运行时破坏,查询将突然开始产生错误的结果。这些类型的错误是隐匿的。报告出现问题,潜在的财务披露不正确。
对于那些不熟悉自然连接的人。它们将两个表连接在每个表中都存在的列名上。当你拥有4列键并且厌倦了输入时,这真的很酷。问题在于Table1具有名为DESCRIPTION的预先存在的列,并且您向Table2添加了一个新列,例如,我不知道,像DESCRIPTION这样的无害名称,现在您正在连接两个表中的VARCHAR2(1000)自由形式字段。
使用USING从句还可能导致完全的歧义,除了上述问题。在另一个SO post中,有人展示了这个ANSI-92 SQL,并请求帮助阅读它。
SELECT c.*
FROM companies AS c
JOIN users AS u USING(companyid)
JOIN jobs AS j USING(userid)
JOIN useraccounts AS us USING(userid)
WHERE j.jobid = 123
这完全是含糊不清的。我在公司和用户表中都放置了UserID列,但没有投诉。如果公司中的UserID列是修改该行的最后一个人的ID呢?
说真的,有人能解释为什么这种歧义是必要的吗?为什么它直接内置在标准中?
我认为Bill是正确的,有很多开发人员通过复制/粘贴来编码。事实上,当涉及到ANSI-92时,我也可以承认自己有点像其中之一。我看到的每个示例都显示了多个连接嵌套在括号中。老实说,这使得在sql中挑选表格变得非常困难。但是,然后一个SQL92的布道者解释说,这实际上会强制执行连接顺序。天哪...所有那些我见过的复制粘贴者现在实际上正在强制执行连接顺序 - 这是95%的时间最好留给优化器完成的工作,尤其是复制粘贴者。
当Tomalak说:
人们不会仅仅因为新语法存在而切换
它必须给我带来一些东西,我没有看到任何好处。即使有好处,负面影响也太大了,无法忽视。