广泛讨论了很多次,包括我的一个。
使用显式连接而不是隐式连接(无论它们是否是外连接)是因为使用隐式连接意外创建笛卡尔积要容易得多。
使用显式 JOIN,您不能“意外”创建一个。涉及的表越多,您错过一个连接条件的风险就越高。
与 ANSI 连接相比,基本上 (+) 受到严格限制。此外,它仅在 Oracle 中可用,而所有主要 DBMS 都支持 ANSI 连接语法
迁移到 ANSI 语法后,SQL 不会开始更好地执行 - 它只是语法不同。
Oracle 强烈建议您使用前面示例中显示的更灵活的 FROM 子句连接语法。过去,ANSI 语法存在一些错误,但如果您使用最新的 11.2 或 12.1,则应该已经修复。
使用 JOIN 运算符可确保您的 SQL 代码符合 ANSI,从而允许前端应用程序更容易移植到其他数据库平台。
连接条件对每个表的选择性非常低,而对理论叉积中的元组选择性很高。where 语句中的条件通常具有更高的选择性。
Oracle 在内部将 ANSI 语法转换为 (+) 语法,您可以在执行计划的谓词信息部分看到这种情况。
如果您使用的是 11.2,我建议加入 ANSI。如果你使用 12C,在 OUTER JOINS 上会发现一些新的 bug。
我还记得 Oracle 在使用 ANSI 语法时的一些错误,在 11.2 之前,它在 11.2 中得到了修复。
在我看来,我不是 ANSI 语法的忠实拥护者,尽管 Oracle 确实符合 ANSI 的标准,但它并非完全没有错误。