ANSI和非ANSI连接有什么区别,您建议使用哪种?

时间:2013-11-11 11:17:40

标签: sql oracle join

我遇到很多网站,找到哪个更好,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 个答案:

答案 0 :(得分:4)

这两种语法通常都可以正常工作,但是如果你尝试添加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;

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

多次广泛讨论including one by me

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

使用显式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上会出现一些新错误。

我还记得在使用ANSI语法时Oracle中的一些错误,在11.2之前它在11.2中得到修复。

在我看来,我不是ANSI语法的忠实粉丝,尽管Oracle确实按照ANSI的标准确认,it is not totally bug free.

答案 3 :(得分:0)

请阅读此article关于加入的内容。 如果B表中有数据而不是A表中的数据

,则示例的结果不相同