刚刚看了一个写SQL的题,题目是假设有如下表
求出每个部门(deptno)sal排名前三的员工。
我自己写的是
SELECT e1.deptno, e1.ename, e1.sal
FROM EMP e1
LEFT JOIN EMP e2
ON e2.deptno = e1.deptno
WHERE e2.sal >= e1.sal
GROUP BY e1.ENAME
HAVING COUNT(1) <=3;
ORDER BY e1.deptno, e1.sal DESC;
但是看到网上有人写的是
SELECT deptno, ename, sal
FROM emp e1
WHERE
(
SELECT count(1)
FROM emp e2
WHERE e2.deptno=e1.deptno AND e2.sal>=e1.sal
) <=3
ORDER BY deptno, sal DESC;
讲真,网上写的那个我看不太懂,而且有关二者的性能我也完全不会分析。因此想要问问有没有解决我困惑的书呢?也不知道怎么描述就干脆说成SQL执行分析相关的书籍。想来书里会写笛卡尔乘积什么的。
《SQL Server 2008 技术内幕》 希望有帮助
排名前三的还可以这么写
select * from
(
select *,row_number()over(partition by deptno order by sal desc) as px from EMP
) as t
如果你基础还不错的话 可以看看SQL SERVER 2008技术内幕之T-SQL查询
或者SQL 2005技术内幕系列 一共有4本。
如果你想学习基础 可以看类似 SQL 2012宝典 这样的书