ANSI092标准包括一些相当令人讨厌的语法。自然联接是一个,而USING子句是另一个。恕我直言,向表中添加列不应破坏代码,但NATURAL JOIN的破坏方式最为严重。打破错误的“最佳”方法是编译错误。例如,如果您在某处选择*,则添加列可以无法编译。下一个失败的最佳方法是运行时错误。更糟的是,因为您的用户可能会看到它,但是它仍然会向您发出警告,告知您已损坏某些东西。如果您使用ANSI92并使用NATURAL Joins编写查询,则它不会在编译时中断,也不会在运行时中断,查询将突然开始产生错误的结果。这些类型的错误是阴险的。报告有误,可能是财务披露不正确。
对于不熟悉NATURAL Joins的用户。它们在两个表中存在的每个列名上连接两个表。当您有4列键并且讨厌键入时,这真的很酷。当Table1有一个预先存在的列,名称为DESCRIPTION,而您在Table2中添加了一个新列,这个问题就出现了,哦,我不知道,mmm,DESCRIPTION之类的东西是无害的,现在您要在VARCHAR2上连接两个表(1000)字段为自由格式。
除了上述问题之外,USING子句还可能导致完全的歧义。在另一篇SO帖子中,有人展示了此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%的时间留给了优化人员,尤其是复制/粘贴人员。
托玛拉克说得对,
人们不会仅仅因为有新语法就改用新语法
它必须给我一些东西,但我看不到任何好处。如果存在上行空间,那么负面因素就太大了,不容忽视。