2010-12-11 9 views
0

T1:従業員[ID、給与]内部結合:これは最適なソリューションですか?

T2:部署[名、社員] (社員がT1のIDへの外部キーである)

問題:どの部署の名前を取得するクエリを書きます最高給与を受け取る。

マイソリューション:

SELECT DISTINCT name 
FROM department AS a 
INNER JOIN employee AS b ON a.employeeid = b.id 
AND b.salary 
IN ( 
    SELECT max(salary) 
    FROM employee AS c 
) 

編集:問題の記述が正確である、と私たちは最高の給与を持っている従業員を見つけるためにしようとしていません。 「......受け取っている部署」ではなく「...従業員を受けている」と言います。

これは問題ありませんか?それとも最適化できますか?

+1

あなたはどのようなデータベースとバージョンを使用していますか? –

+1

あなたは、最高給与の従業員が働いている部署、または給料の最大合計を持っている部署を見つけるはずですか?なぜなら、あなたのコードは1つを表し、テキストはもう1つを表すからです。 –

+2

そして、これは宿題ですか? –

答えて

3

GROUP BY部門とSUM(給与)による注文の名前。

SELECT department.name 
FROM department 
JOIN employee ON department.employeeid = employee.id 
GROUP BY department.name 
ORDER BY SUM(salary) DESC 
LIMIT 1 
+0

いいえ、質問はあなたが最初に解釈したことを意味しました。部門には複数の従業員がいます。だから、私たちはどの部門が現金流入量が最大であるかを調べようとしています。つまり、各部門のすべての従業員のすべての給与を合計すると、どの給付部門が最高給与を出していますか? –

+0

この1つについても素晴らしい、素晴らしい洞察力! –

+0

このクエリは、その部門の従業員**の給与の合計を持つ部署の一覧を返す必要があります。 order byとlimit句を使用すると、最高給与総額の部門だけが返されます。これは、元の質問の答えとして私に見えます。 – skajfes

0

方法について:

SELECT employee.id, employee.salary, department.name 
FROM department, employee 
where 
employee.id = department.employeeid and 
employee.salary = (select max(salary) from employee) 
+0

これは間違いなく速く実行されます。 – Arc

+0

テーブルの構造をご覧ください。あなたの努力を尊重しながら、クエリはまだそれに合っていません(列名)。 –

+0

@JavaMental、今すぐお試しください –

関連する問題