2017-03-19 5 views
0

より大きい従業員の給料を検索します。MySQLのクエリは、だから、私はこのスキーマを持っている任意のマネージャー

select E.ename, D.did, E.eid 
from Emp E 
join Works W ON E.eid = W.eid 
join Dept D ON D.did = W.did 
where E.salary > (select E2.salary from Emp E2, Dept D2 
       where E2.eid = D2.managerid) 

しかし、サブクエリステートメントは複数の行を返しています。正しい結果を得るために、2つのテーブルから複数の行を比較するにはどうすればよいですか?グループ化はうまくいくはずですか?

答えて

0

worksテーブルが必要な理由がわかりません。質問は、マネージャーに関するものです。あなたがこれを書くことができる一つの方法は、> allを使用している:

select e.* 
from emp e 
where e.salary > all (select e2.salary 
         from emp e2 join 
          dept d2 
          on e2.eid = d2.managerid 
        ); 

あなたはサブクエリを実行し、すべての管理職の給与を返すことがわかります。給与が給与よりも大きい従業員が欲しい。

編集:

このバージョンは機能しますか?期待通りの任意の給与がNULLある場合

select e.* 
from emp e 
where e.salary > (select MAX(e2.salary) 
        from emp e2 join 
         dept d2 
         on e2.eid = d2.managerid 
       ); 

> allが動作しない場合があります。

+0

空のテーブルが返されます。 –

1

給与がマネージャよりも大きい従業員を戻したい場合、すべてのマネージャの最低給与よりも高い給与を持つすべての従業員を見つけられないのはなぜですか?

select E.ename, D.did, E.eid 
from Emp E 
join Works W ON E.eid = W.eid 
join Dept D ON D.did = W.did 
where E.salary > (select min(E2.salary) 
        from Emp E2, Dept D2 
        where E2.eid = D2.managerid) 
1

あなたの要件は、自分の給与よりも給与が低いマネージャーを持つ従業員を見つけることに変換できます。 これを試すことができます。

SELECT e.* 
FROM emp e 
WHERE EXISTS (SELECT 1 
                       FROM emp e2 INNER JOIN 
                            dept d2 
                           ON e2.eid = d2.managerid 
                          WHERE  e2.salary < e.salary); 
関連する問題