日期:2014-05-17  浏览次数:20695 次

关于distinct与exits
select distinct dept.deptno,dname from dept,emp where dept.deptno=emp.deptno;

select deptno,dname from dept where exists (select 1 from emp where emp.deptno=dept.deptno);

select dept.deptno,dname from dept,(select distinct deptno from emp) tmp where tmp.deptno=dept.deptno;
===================================
请问这三者在性能方面有什么区别??初学这东西,不太懂

------解决方案--------------------
用EXISTS替换DISTINCT: 当提交一个包含一对多表信息(比如部门表和雇员表)的查询时,避免在SELECT子句中使用DISTINCT. 一般可以考虑用EXIST替换, EXISTS 使查询更为迅速,因为RDBMS核心模块将在子查询的条件一旦满足后,立刻返回结果.
(低效): 

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); 

用EXISTS的确可以替代DISTINCT,不过以上方案仅适合DEPT_NO为唯一主键的情况。 如果要去掉重复记录,需参照以下方法: 

SELECT * FROM EMP WHERE DEPT_NO EXISTS(select Max(DEPT_NO) FROM DEPT D , EMP E WHERE E.DEPT_NO = D.DEPT_NO GROUP BY D.DEPT_NO) 


------解决方案--------------------
你现在飞速进阶了~呵呵,我也不懂,帮你顶顶~
------解决方案--------------------
还有数据量大的表放在外层


------解决方案--------------------
用到distinct的时候其实相当于是数据库的in操作,在效率上来说in 和exists是有区别的,
exists的查询速度要比in快
in 它却采用的是"OR策略",即先取出满足每个or子句的行,存入临时数据库的工作表中,再建立唯一索引以去掉重复行,最后从这个临时表中计算结果,
而exists则不同,exists讲究的是一个存在与非存在的问题,也就是说只要你满足我where条件我就认为条件为真,直接返回.速度会比in快.