( 低效 ):
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 ) ;
怎么个高效啊
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 ) ;
怎么个高效啊
第二个不加distinct 也不能去重啊
具体可以查看相应的执行计划!
当然,如果对于特定环境,比如dept表中选择出来的结果确实的唯一的,
那么第二种方式确实高效。
因为,第一种方式要找出所有的dept,emp关联的笛卡尔结果集,然后进行排序,过滤得到的结果。
第二种方式只需要遍历dept(如果结果唯一,这应该是个小表,相对的),对dept中的每条记录,去找寻emp中任意一条匹配的结果,发现后马上返回
这意味着,1,如果emp中存在dept中的索引,则不需要回到emp的表中定位结果;
2,发现一条后就可以返回,而不需要遍历所有的emp表;
所以,楼主描述的第二种方式在特定环境下相对高效。