查询每个部门的最高工资,并添加该员工的名字
我是这样写的
select max(s1.salary),s2.last_name
from s_emp s1,s_emp s2
group by s1.dept_id,s2.last_name,s1.last_name
having s1.last_name=s2.last_name;
结果不对,把每个员工的都给查询出来了。我哪里错了?为什么
另外一个稍微难一点的显示各门课程的考场数目和可容纳的考生
各数据表结构如下:
表1:课程表 TC
cid 课程id
cname 课程名
Ctype 考试方式
表2:考场表 TR
Roomed 考场id
address 考场地址
Contain 容纳人数
表3:考场课程对应表 TCR
cid 课程id
roomId 考场id
这个也是多表查询的,该如何查询?

解决方案 »

  1.   

    1、
    select  dept_id,last_name,salary
    from s_emp
    where (salary,dept_id) in (select max(salary),deot_id from emp group by dept_id);
      

  2.   


    --问题1
    select * from (
    select s1.*, row_number() over (partition by dept_id order by salary desc) rn
      from s_emp s1) where rn=1;--问题2
    select cname, count(cname) as 考场数目, sum(contain) as 可容纳的考生 from(
    select * from tcr
      left join tc on tcr.cid=tc.cid
      left join tr on tcr.roomid=tr.roomid);
      

  3.   

    2、 我也不知道对不对  没有数据验证
     select tc.cid,count(tcr.roomid),tr.contain from tc,tr,tcr
     where tc.cid=tcr.cid and tr.roomid=tcr.roomid
     group by tc.cid ,tr.contain
      

  4.   

    ---tc\\\
           CID CNAME
    ---------- ----------
             1 yingyu
             2 math
             3 law
    ----tr\\\
        ROOMID    CONTAIN
    ---------- ----------
             1         10
             2         20
             3         30---tcr\\\      CID     ROOMID
    --------- ----------
            1          2
            2          3
            3          1  1  select tc.cid,sum(tcr.roomid),sum(tr.contain) from tc,tr,tcr
      2  where tc.cid=tcr.cid and tr.roomid=tcr.roomid
      3* group by tc.cid ,tr.contain
    SQL> /       CID SUM(TCR.ROOMID) SUM(TR.CONTAIN)
    ---------- --------------- ---------------
             3               1              10
             1               2              20
             2               3              30
      

  5.   

    第一个:
    select *
      from s_emp e1
     where not exists (select 1
              from s_emp e2
             where e2.dept_id = e1.dept_id
               and e2.salary > e1.salary)
      

  6.   


    --第二问
    select tc.cname, t.c_room, t.contain
      from tc,
           (select cid, count(tr.roomid) c_room, sum(tr.contain) contain
              from tr, tcr
             where tr.roomed = tcr.roomid
             group by cid)
     where tc.cid(+) = t.cid
      

  7.   

    你这查出的是所有的信息,而我需要的是: max(s1.salary),s2.last_name麻烦改一下吧。
      

  8.   

    Q1:
    with test as (
    select 'A' AS BM ,'100' AS GZ,'T1' AS BNAME FROM DUAL
    UNION ALL
    select 'A' AS BM ,'300' AS GZ,'T2' AS BNAME FROM DUAL
    UNION ALL
    select 'A' AS BM ,'300' AS GZ,'T3' AS BNAME FROM DUAL
    UNION ALL
    select 'B' AS BM ,'400' AS GZ,'T4' AS BNAME FROM DUAL
    UNION ALL
    select 'B' AS BM ,'500' AS GZ,'T5' AS BNAME FROM DUAL
    UNION ALL
    select 'B' AS BM ,'600' AS GZ,'T6' AS BNAME FROM DUAL
    )
    SELECT BNAME,BM,GZ FROM(
    SELECT DENSE_RANK()OVER(PARTITION BY BM ORDER BY GZ DESC) AS RN,BM,GZ,BNAME FROM TEST) WHERE RN = 1Q2:
    WITH TC AS (
    select 'A01' AS cid ,'AA' AS cname,'T1' AS Ctype FROM DUAL
    UNION ALL
    select 'A02' AS cid ,'AB' AS cname,'T2' AS Ctype FROM DUAL
    ),
    TR AS (
    select '001' AS roomId ,'CLASS1' AS address,'30' AS Contain FROM DUAL
    UNION ALL
    select '002' AS roomId ,'CLASS2' AS address,'35' AS Contain FROM DUAL
    UNION ALL
    select '003' AS roomId ,'CLASS3' AS address,'25' AS Contain FROM DUAL
    UNION ALL
    select '004' AS roomId ,'CLASS4' AS address,'40' AS Contain FROM DUAL
    UNION ALL
    select '005' AS roomId ,'CLASS5' AS address,'30' AS Contain FROM DUAL
    ),
    TCR AS (
    select 'A01' AS cid ,'001' AS roomId FROM DUAL
    UNION ALL
    select 'A01' AS cid ,'002' AS roomId FROM DUAL
    UNION ALL
    select 'A01' AS cid ,'003' AS roomId FROM DUAL
    UNION ALL
    select 'A02' AS cid ,'004' AS roomId FROM DUAL
    UNION ALL
    select 'A02' AS cid ,'005' AS roomId FROM DUAL
    )
    SELECT TC.cname,COUNT(TR.roomId),SUM(TR.Contain) FROM TC INNER JOIN TCR ON TC.cid = TCR.cid INNER JOIN TR ON TCR.roomId = TR.roomId GROUP BY TC.cname
      

  9.   

    问题一的原因:
        因为在group by 语句中,你是以部门名称和员工姓名进行分组的,所以就会把每个员工的姓名都查出来。
    正确的做法是先按照部门名称进行分组,取出每个部门的部门名称和最高工资,然后再依据部门号和最高工资查员工姓名。
    这说明,你对group by语句的理解有点欠缺。SELECT S2.DEPT_ID, S2.LAST_NAME, S2.SALARY
      FROM S_EMP S2
     WHERE (S2.DEPT_ID, S2.SALARY) IN
           (SELECT S1.DEPT_ID, MAX(S1.SALARY) FROM S_EMP S1 GROUP BY S1.DEPT_ID)
    问题二:
       我看问题二的本质就是要弄懂三个表之间该怎么关联,表1和表3用课程id进行关联,表2和表3之间用考场id关联。
    用去重后的考场id做为课程的考场数目,用容纳人数的求和做为课程的可容纳考生
      select t1.cname  课程名称,count(distinct t3.roomld)  考场数目,
             sum(t2.contain) 可容纳的考生
      from tc t1,tr t2,tcr t3
      where t1.cid=t3.cid and t2.roomed=t3.roomld
    group by t1.cname