+ -
当前位置:首页 → 问答吧 → 关于distinct与exits

关于distinct与exits

时间:2011-12-19

来源:互联网

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;
===================================
请问这三者在性能方面有什么区别??初学这东西,不太懂

作者: tanshi   发布时间: 2011-12-19

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

作者: yixilan   发布时间: 2011-12-19

你现在飞速进阶了~呵呵,我也不懂,帮你顶顶~

作者: Wayo2008   发布时间: 2011-12-19