Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql ANSI连接和非ANSI连接有什么区别,您推荐哪种连接?_Sql_Oracle_Join - Fatal编程技术网

Sql ANSI连接和非ANSI连接有什么区别,您推荐哪种连接?

Sql ANSI连接和非ANSI连接有什么区别,您推荐哪种连接?,sql,oracle,join,Sql,Oracle,Join,我曾访问过许多网站,以找到关于哪个更好的答案,ANSI语法还是非ANSI语法。这两个查询之间有什么区别 select a.name,a.empno,b.loc from tab a, tab b where a.deptno=b.deptno(+); 以及: 两种情况下的结果是相同的。第二个查询也更长。哪一个更好 假设我们在上面的查询中添加了另一个表Salgrade,基于我们需要加入它们的条件。。 任何人都可以假设一个表并给我解释一下吗?第一个是传统的Oracle特定于编写联接的方法,第二个是

我曾访问过许多网站,以找到关于哪个更好的答案,ANSI语法还是非ANSI语法。这两个查询之间有什么区别

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

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

假设我们在上面的查询中添加了另一个表Salgrade,基于我们需要加入它们的条件。。
任何人都可以假设一个表并给我解释一下吗?第一个是传统的Oracle特定于编写联接的方法,第二个是ANSI SQL-92+标准,是首选方法。

经过多次广泛讨论

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

使用显式联接,您不能“偶然”创建联接。涉及的表越多,错过一个连接条件的风险就越高

基本上(+)与ANSI连接相比受到严重限制。此外,它仅在Oracle中可用,而所有主要DBMS都支持ANSI join语法

SQL在迁移到ANSI语法后不会表现得更好——只是语法不同而已

Oracle强烈建议您使用前一个示例中所示的更灵活的FROM子句join语法。过去,ANSI语法有一些错误,但如果使用最新的11.2或12.1,应该已经修复了

使用连接操作符可以确保SQL代码符合ANSI标准,从而使前端应用程序更容易移植到其他数据库平台

连接条件对每个表的选择性很低,而对理论叉积中的元组的选择性很高。where语句中的条件通常具有更高的选择性

Oracle在内部将ANSI语法转换为(+)语法,您可以在执行计划的谓词信息部分看到这种情况

如果您使用的是11.2,我建议您加入ANSI。如果使用12C,则在外部联接上发现了一些新的错误

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


在我看来,我不太喜欢ANSI语法,尽管Oracle确实确认了ANSI的标准,

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

(一)

(二)

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

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

:“Oracle建议您使用FROM子句外部联接语法,而不是Oracle联接运算符”如果您有兴趣/计划将当前db迁移到Azure,则非ANSI样式将带来突破性的更改(表示最新版本的数据库不支持)。在迁移到Azure Cloud之前,您必须将所有查询转换为ANSI标准。您可以通过搜索数据迁移助手(DMA)查看更多详细信息。+1我几乎不使用ANSI连接语法,因为它更具可读性(imho)。您好,假设我们添加了另一个表“萨尔格拉德"在上面的基于什么条件的查询中,我们需要加入它们?你能用一个例子解释一下如何加入3个或更多的表吗?你的解释很好。那就是我特别问你的问题。在
on
条件之后,你将添加下一个加入条件。我在这里准备了一个小演示:非ANSI nota这只能表示有限的条件。
select a.name,a.empno,b.loc
from tab a 
left outer join tab b on a.deptno=b.deptno;
  SELECT a.name,
         a.empno,
         b.loc 
    FROM tab a,
         tab b 
   WHERE a.deptno = b.deptno(+)
     AND a.empno = 190;
         SELECT a.name,
                a.empno,
                b.loc 
           FROM tab a,
LEFT OUTER JOIN tab b 
             ON a.deptno = b.deptno
          WHERE a.empno = 190;