例子4:求出每一个部门里赚钱最多的那个人的名字
Select ename, deptno, sal from emp where sal in (
Select sal from (--不理解from 后面为什么没有tablename,而是紧跟是(),()里是字段值,我想问()里可以是字段值吗?
Select deptno, max(sal) sal from emp group by deptno
)
)
谢谢了。

解决方案 »

  1.   

    select ename
    from emp e1
    where exists (select 1 from e2 
                  where e2.deptno=e1.deptno
                  group by e2.deptno
                  having max(sal)=e1.sal );
      

  2.   

    select ename
    from emp e1
    where exists (select 1 from emp e2 
                  where e2.deptno=e1.deptno
                  group by e2.deptno
                  having max(sal)=e1.sal );
      

  3.   

    上面那个查询并不准确,应该改成
    Select ename, deptno, sal from emp where (deptno,sal) in (
    Select deptno,sal from (--括号里的是一个子查询,你可以把()里的内容当成一个视图
    Select deptno, max(sal) sal from emp group by deptno
    )
    )
    多嵌套的那层也是多此一举。我比较喜欢下面的写法
    select * from emp t
    where not exists(
      select 1 from emp where deptno=t.deptno
        and sal>t.sal)
      

  4.   

    select ename, deptno, sal
    from emp e1
    where exists (select 1 from emp e2 
                  where e2.deptno=e1.deptno
                  group by e2.deptno
                  having max(sal)=e1.sal );
      

  5.   

    --上面的语句多了一层没有的子查询,简化一下
    --from 后面的整个括号的内容实际上是一个子查询产生的数据集,可把它看成一个普通表就行了
    --from后不能直接是字段
    SELECT ename, deptno, sal FROM emp WHERE sal IN (SELECT MAX(sal) FROM emp GROUP BY deptno)
      

  6.   

    --另外用分析函数也是可以的
    SELECT ename, deptno, sal
      FROM (SELECT ename, deptno, sal, rank() over(PARTITION BY t.deptno ORDER BY sal DESC) rn
              FROM emp t)
     WHERE rn = 1;
      

  7.   

    是个嵌套子查询,关于嵌套子查询可以参考:SQL 基础--> 子查询SELECT ename, deptno, sal
    FROM emp e
    WHERE sal in 
        (SELECT MAX(sal) FROM emp m 
         WHERE e.deptno = m.deptno) 
      

  8.   


    --可以直接这样来 高效
    select ename, deptno, sal from emp a where not exists(select 1 from emp where a.deptno=deptno and a.sal<sal)
      

  9.   

    为什么是not exists 啊
    我怎么感觉应该是  exists 啊
      

  10.   

    ann兄昨天为这个困惑了好久啊,原来源头在这里啊
      

  11.   

    select a.ename,a.sal,a.deptno from emp a,(select max(sal) salary,deptno from emp group by deptno) b where a.deptno=b.deptno and a.sal=b.salary
      

  12.   

    select a.ename,a.sal,a.deptno from emp a where a.sal=(select max(sal) from emp where a.deptno=emp.deptno) 
      

  13.   


    在exists,not exists 和分析函数这三个sql里,分析函数效率最高吧。
      

  14.   

    这个不对呀,没用表连接,晕~~~select a.ename,a.sal,a.deptno from emp a join (select max(sal) max_sal,deptno from emp group by deptno) b on (a.deptno=b.deptno and a.sal=b.max_sal)
      

  15.   

    其实这样也行,更便于理解
    select e1.ename,e1.deptno,e1.sal from emp e1 where exists (select 1 from emp e2 where e1.deptno=e2.deptno and e1.sal=(select max(sal) from emp where deptno=e2.deptno));