写法一:(得到结果一)select e.empno,e.ename,d.deptno,d.dname,d.loc
from emp e,dept d
where e.deptno(+)=d.deptno;结果一:
     EMPNO ENAME          DEPTNO DNAME          LOC
---------- ---------- ---------- -------------- -------------
      7782 CLARK              10 ACCOUNTING     NEW YORK
      7839 KING               10 ACCOUNTING     NEW YORK
      7934 MILLER             10 ACCOUNTING     NEW YORK
      7369 SMITH              20 RESEARCH       DALLAS
      7876 ADAMS              20 RESEARCH       DALLAS
      7902 FORD               20 RESEARCH       DALLAS
      7788 SCOTT              20 RESEARCH       DALLAS
      7566 JONES              20 RESEARCH       DALLAS
      7499 ALLEN              30 SALES          CHICAGO
      7698 BLAKE              30 SALES          CHICAGO
      7654 MARTIN             30 SALES          CHICAGO
      7900 JAMES              30 SALES          CHICAGO
      7844 TURNER             30 SALES          CHICAGO
      7521 WARD               30 SALES          CHICAGO
                              40 OPERATIONS     BOSTON已选择15行
写法二:(得到结果二)select e.empno,e.ename,d.deptno,d.dname,d.loc
FROM emp e RIGHT OUTER JOIN dept d
ON (e.deptno=d.deptno);结果二:     EMPNO ENAME          DEPTNO DNAME          LOC
---------- ---------- ---------- -------------- ----------
      7369 SMITH              20 RESEARCH       DALLAS
      7499 ALLEN              30 SALES          CHICAGO
      7521 WARD               30 SALES          CHICAGO
      7566 JONES              20 RESEARCH       DALLAS
      7654 MARTIN             30 SALES          CHICAGO
      7698 BLAKE              30 SALES          CHICAGO
      7782 CLARK              10 ACCOUNTING     NEW YORK
      7788 SCOTT              20 RESEARCH       DALLAS
      7839 KING               10 ACCOUNTING     NEW YORK
      7844 TURNER             30 SALES          CHICAGO
      7876 ADAMS              20 RESEARCH       DALLAS
      7900 JAMES              30 SALES          CHICAGO
      7902 FORD               20 RESEARCH       DALLAS
      7934 MILLER             10 ACCOUNTING     NEW YORK
                              40 OPERATIONS     BOSTON已选择15行
得到的结果是一样的,但是这两种写法得到的结果也有细微的区别:排序不同!
我的问题,这个不同的排序时如何引起的?

解决方案 »

  1.   

    你把两个语句的执行计划拉出来看看,有可能是join的顺序不一样
      

  2.   

    从图上看
    第一个按deptno排序
    第二个按empno排序
    为什么我不懂。关注楼下的回答
      

  3.   

    两个都是外关联,(+)是9i以前的写法,OUTER JOIN是9i以后增加的写法,符合SQL标准,楼主可不必关心返回的排序,如果不加order by ,oracle不会保证数据的返回顺序。
      

  4.   

    楼主同志,我在自己的机器上试了,执行计划和返回结果都是一模一样的,不清楚你的oracle是什么样的设置,有没有使用CBO
      

  5.   

    什么执行计划?我就是在9i的SQL*Plus中以scott用户登录,然后执行上述SQL的
      

  6.   

    执行计划在oracle中是一个非常重要的东西,英文是execution plan,到网上找找,明白这个,才能写出高效率的oracle SQL语句来当然,简单一点说,就是字面上的意义,一个sql语句是如何执行的,这个执行是有一个具体的步骤,比如第一个表的数据是通过什么方式取(全表扫或者索引),然后是如何安排两个表的join顺序等等,这就是执行计划
      

  7.   

    是的,像OUTER JOIN是1999语法:
    1999语法对SQL的支持:
    SELECT table1.column,table2.column
    FROM table1 [CROSS JOIN table2] |
    [NATURAL JOIN table2] |
    [JOIN table2 USING(column_name)] |
    [JOIN table2 ON(table1.column_name=table2.column_name)] |
    [LEFT|RIGHT|FULL OUTER JOIN table2 ON(table1.column_name=table2.column_name)];还有,你说得【如果不加order by ,oracle不会保证数据的返回顺序。】不保证数据返回的顺序那也应当是随机排序吧,但是我查询的结果是这2种写法的结果是分别一致的
      

  8.   

    如果不加order by,那么数据顺序就是磁盘或者缓存中存放的顺序,这个是不能保证每一次都是一样的
      

  9.   

    想要预期的排序结果,就加order by,否则就不是你想要的。