ANSI092 标准包含一些非常令人发指的语法。自然连接是一个,而 USING 子句是另一个。恕我直言,向表中添加列不应破坏代码,但 NATURAL JOIN 会以最令人震惊的方式破坏。破解的“最佳”方法是编译错误。例如,如果您在某处选择 *,则添加一列可以编译失败。失败的下一个最佳方法是运行时错误。更糟糕的是,您的用户可能会看到它,但它仍然会给您一个很好的警告,表明您已经破坏了某些东西。如果您使用 ANSI92 并使用 NATURAL 连接编写查询,它不会在编译时中断,也不会在运行时中断,查询将突然开始产生错误的结果。这些类型的错误是阴险的。报告出错,可能财务披露不正确。
对于那些不熟悉自然连接的人。他们在两个表中存在的每个列名上连接两个表。当您有一个 4 列键并且您厌倦了键入它时,这真的很酷。当 Table1 有一个名为DESCRIPTION 的预先存在的列并且您向Table2 添加一个名为的新列时,问题就来了(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
这是完全模棱两可的。我在 Companies 和 user 表中都放置了一个 UserID 列,没有任何投诉。如果公司中的 UserID 列是最后一个修改该行的人的 ID 怎么办?
我是认真的,谁能解释为什么这种模棱两可是必要的?为什么它直接内置到标准中?
我认为比尔是正确的,有大量的开发人员通过编码复制/粘贴到那里。事实上,我可以承认在 ANSI-92 方面我是其中的一员。我见过的每个示例都显示多个连接嵌套在括号中。老实说,这使得在 sql 中挑选表充其量是困难的。但随后一位 SQL92 布道者解释说,这实际上会强制执行连接顺序。耶稣……我见过的所有复制粘贴器现在实际上都在强制加入订单 - 95% 的工作最好留给优化人员,尤其是复制/粘贴。
托马拉克说得对,他说,
人们不会仅仅因为它在那里就切换到新语法
它必须给我一些东西,我看不出有什么好处。如果有上行空间,那么负面因素就是一只大到不容忽视的信天翁。