( 低效 ): 
SELECT   DISTINCT  DEPT_NO,DEPT_NAME   FROM  DEPT D , EMP E 
WHERE  D.DEPT_NO = E.DEPT_NO 
( 高效 ): 
SELECT  DEPT_NO,DEPT_NAME   FROM  DEPT D   WHERE   EXISTS ( SELECT ‘X' 
FROM  EMP E   WHERE  E.DEPT_NO = D.DEPT_NO ) ; 
怎么个高效啊

解决方案 »

  1.   

    第一个中有DISTINCT  要进行排序  你可以看下执行计划第二个中没有的。。
      

  2.   


    第二个不加distinct 也不能去重啊
      

  3.   

    这个不能一概而论,但是在大数据量下,尽量使用表连接而非exists速度可能会更快。
    具体可以查看相应的执行计划!
      

  4.   

    一般情况下表连接会比非独立子查询要快,非独立子查询就像两个嵌套的for循环一样,由于彼此有依赖关系,也没有办法并行执行。
      

  5.   

    这两个结果未必一样的
    当然,如果对于特定环境,比如dept表中选择出来的结果确实的唯一的,
    那么第二种方式确实高效。
    因为,第一种方式要找出所有的dept,emp关联的笛卡尔结果集,然后进行排序,过滤得到的结果。
    第二种方式只需要遍历dept(如果结果唯一,这应该是个小表,相对的),对dept中的每条记录,去找寻emp中任意一条匹配的结果,发现后马上返回
    这意味着,1,如果emp中存在dept中的索引,则不需要回到emp的表中定位结果;
              2,发现一条后就可以返回,而不需要遍历所有的emp表;
    所以,楼主描述的第二种方式在特定环境下相对高效。