4

我在许多网站上找到了关于哪个更好,ANSI 或非 ANSI 语法的答案。这两个查询有什么区别?

select a.name,a.empno,b.loc
from tab a, tab b
where a.deptno=b.deptno(+);

和:

select a.name,a.empno,b.loc
from tab a 
left outer join tab b on a.deptno=b.deptno;

两种情况下的结果都是一样的。第二个查询也更长。哪一个更好?

假设我们在上面的查询中添加了另一个表 Salgrade 基于我们需要加入它们的条件?..任何人都可以假设一张桌子并给我解释

4

4 回答 4

7

这两种语法通常都可以正常工作,但是如果您尝试添加 where 条件,您会发现使用第二种语法更容易理解哪个是连接条件,哪个是 where 子句。

1)

  SELECT a.name,
         a.empno,
         b.loc 
    FROM tab a,
         tab b 
   WHERE a.deptno = b.deptno(+)
     AND a.empno = 190;

2)

         SELECT a.name,
                a.empno,
                b.loc 
           FROM tab a,
LEFT OUTER JOIN tab b 
             ON a.deptno = b.deptno
          WHERE a.empno = 190;

此外,识别外连接要容易得多,而且不要忘记包含 (+)。总的来说,您可以说这只是一个品味问题,但事实是第二种语法更具可读性且不易出错。

于 2013-11-11T11:27:25.877 回答
1

第一种是传统的 Oracle 特定的连接编写方式,第二种是 ANSI SQL-92+ 标准,是首选方式。

于 2013-11-11T11:26:20.060 回答
1

广泛讨论了很多次,包括我的一个

使用显式连接而不是隐式连接(无论它们是否是外连接)是因为使用隐式连接意外创建笛卡尔积要容易得多。

使用显式 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 的标准,但它并非完全没有错误。

于 2013-11-11T11:26:28.110 回答
0

请阅读这篇关于连接的文章。如果您在 B 表中而不在 A 表中有数据,则示例的结果不一样

于 2013-11-11T11:33:36.900 回答