1

2つのテーブル/列があるとします。

Employee - > EmpId, DeptNo, EmpName, Salary
Department -> DeptNo, DeptName

クエリを作成して、すべての部門で最高の給与を受け取っている従業員の名前を取得します。私はこれを試しました:

Select max(salary),empname 
from Employee 
where deptno = (select deptno 
                from department
                where deptname in('isd','it','sales')

それが正しいか?実は面接の質問です。

4

2 に答える 2

2

これは、グループごとのmaxmysqlパターンの例です。それを行う1つの方法は次のとおりです。

    SELECT e.salary, e.name, d.deptname
    FROM Employee AS e 
     JOIN (
       SELECT max(salary) AS max_sal, deptno
       FROM Employee
       GROUP BY deptno
     ) AS d_max ON (e.salary=d_max.max_sal AND e.deptno=d_max.deptno)
     JOIN Department AS d ON (e.deptno = d_max.deptno)

ただし、複数の従業員が1つの部門で最大給与を持っている場合、1つの部門に対して複数の行が返されます。

于 2012-12-19T15:27:37.537 に答える
0

個人的には、このような質問には cte と row_number を使用します。例えば:

with myCTE as
(
    select e.empName, e.salary, d.deptName, 
        row_number() over (partition by e.deptNo order by e.salary desc) as rn
    from Employee as e
    inner join Department as d
        on d.DeptNo=e.DeptNo
)

select m.empName, m.deptName, m.salary
from myCTE as m
where m.rn=1

同数の場合 (同じ部門の 2 人の従業員の最大給与が同じ)、これは非決定論的です (そのうちの 1 つを返すだけです)。両方を返したい場合は、row_number を Dense_rank に変更します。

于 2012-12-19T17:37:25.630 に答える