1

インタビューの1つで、ある人が私に以下の質問をしました

「クエリを作成して、その部門で最も給与が高いすべての部門のすべての従業員を、部門名、従業員名、および彼の給与で見つけます。」

これは、employeeテーブルに100レコード、departmentテーブルに10レコードがあることを意味します。したがって、クエリから10レコードを取得する必要があります。さらに、どの部門にも従業員がいない場合でも、その部門名を表示する必要があります。

ありがとう

4

6 に答える 6

5

テーブルの構造を見なくても、おそらくこれをいくつかの異なる方法で行うことができると思います。

IN句の使用:

select e.name e_name,
  d.name d_name,
  e.salary
from employee e
inner join department d
  on e.deptid = d.id
where e.salary in (select max(salary)
                   from employee
                   group by deptid);

またはサブクエリを使用する:

select e1.name e_name,
  d.name d_name,
  e1.salary
from employee e1
inner join
(
  select max(salary) salary, deptid
  from employee
  group by deptid
) e2
  on e1.salary = e2.salary
  and e1.deptid = e2.deptid
inner join department d
  on e1.deptid = d.id

両方のデモを含むSQLフィドルを参照してください

現在、MySQLでは、集計関数を適用できGROUP BY、選択リストの非集計フィールドには適用できません(これは、SQL Server、Oracleなどでは実行できません)。したがって、同じ結果を得るのに使用できます。

select e.name e_name,
  d.name d_name,
  max(e.salary) salary
from employee e
inner join department d
  on e.deptid = d.id
group by d.name

デモでSQLフィドルを参照してください

于 2012-11-27T10:41:41.153 に答える
2
Table "emp" has 
id, name,d_id,salary
and Table "department" has 
id, dname

田畑。

以下のクエリは、部門名で最高の給与を出力します

    SELECT  E.id,
            E.name,
            D.dname,
            max(E.salary) as higest_salary 
    FROM `emp` as E 
            left join department as D 
    on D.id=E.d_id 
    group by E.d_id
于 2012-11-27T10:46:53.827 に答える
0

このクエリは、部門のリストを提供します。その部門の給与が最も高い場合はその部門の給与が最も高く、存在しない場合はnullになります。この場合、従業員名を選択しても正しい名前は得られず、リンクされた部門の最初の従業員を返すだけです。

SELECT 
  d.name, 
  MAX(e.salary)
FROM 
  department d 
LEFT OUTER JOIN employee e ON (e.department_id = d.id)
GROUP BY d.id

SQLフィドルを参照してください

給与と従業員名が最も高い部門のリストが必要な場合:

SELECT 
  d.name, 
  e.name, e.salary
FROM 
  department d 
LEFT OUTER JOIN employee e ON (e.department_id = d.id)
WHERE e.salary IN (
  SELECT MAX(em.salary) FROM employee em 
  WHERE em.department_id = d.id
);

SQLフィドルを参照してください

于 2012-11-27T10:44:14.603 に答える
0

SQL Server 2008の場合、最善の解決策ではありません...しかし、Oracle10Gから移行されたHRデータベースで完全に機能しています

以下のコードの結果のスクリーンショット

select e.DEPARTMENT_ID,d.MaxSalary,es.FIRST_NAME,dm.MinSalary,esd.FIRST_NAME
from EMPLOYEES e
 join (select department_id,MAX(salary) MaxSalary from EMPLOYEES group by DEPARTMENT_ID) d
on e.DEPARTMENT_ID=d.DEPARTMENT_ID
 join (select first_name,DEPARTMENT_ID from EMPLOYEES ess where SALARY in (select MAX(salary) from EMPLOYEES where DEPARTMENT_ID=ess.DEPARTMENT_ID)) es
on e.DEPARTMENT_ID=es.DEPARTMENT_ID
 join (select department_id,min(salary) MinSalary from EMPLOYEES group by DEPARTMENT_ID) dm
on e.DEPARTMENT_ID=dm.DEPARTMENT_ID
 join (select first_name,DEPARTMENT_ID from EMPLOYEES ess where SALARY in (select min(salary) from EMPLOYEES where DEPARTMENT_ID=ess.DEPARTMENT_ID )) esd
on e.DEPARTMENT_ID=esd.DEPARTMENT_ID
group by e.DEPARTMENT_ID,d.MaxSalary,es.FIRST_NAME,dm.MinSalary,esd.FIRST_NAME
于 2014-02-04T09:06:04.283 に答える
-1

SELECT empname、MAX(salary)FROM employeeGROUP BYdep_id

上記のクエリは正確な結果を生成します。

于 2015-08-11T06:47:57.233 に答える
-1

empからenameを選択します。ここでsalaryin(select max(salary)from emp group by department);

于 2017-02-16T17:40:32.653 に答える