2016-11-08 7 views
-1

HRスキーマ(oracle)の従業員の表があります。これは私がタスク(彼らはそれらのいずれかに属している場合は、その部門では、最小限の給与を持つ従業員を選択)サブクエリなしでこのクエリを書き直す方法はありますか?

SELECT D.employee_id,D.Last_name,D.salary,D.department_id 
    FROM [HelpDatabase].[dbo].[Employees] D, 
     [HelpDatabase].[dbo].[Employees] E 
    WHERE D.department_id IS NOT NULL 
     AND E.department_id IS NOT NULL 
     AND D.employee_id=E.employee_id 
     AND D.salary=ANY (
      SELECT MIN(E.salary) 
      FROM [HelpDatabase].[dbo].[Employees] 
      GROUP BY E.department_id) 

クエリが正しく動作完了方法ですが、私は使用せずにそれを行うための方法があります言われてきましたサブクエリ。

+0

bs - 構文エラーがあるため、そのクエリは正しく機能しません。 – mathguy

+0

@mathguy - ひどく難読化されたテーブル名でしかない(彼らはほとんど標準の従業員と部署のテーブルだが、なぜ部署がemployee_id列を持つのかは謎だ) –

+0

@mathguyあなたは正しい。それを編集しました。 – Shady119

答えて

1

後に行をフィルタする必要があります

はい、これはサブクエリなしで行うことができます。

select * 
from emp 
where not exists 
(
    select * 
    from emp less 
    where less.department_id = emp.department_id and less.salary < emp.salary 
); 

NOT EXISTSクエリはまた、抗参加するように書くことができます。アイデアは、あなたがいない同じ部署の他の従業員と低給与を存在するため、従業員を探すことができるということです。これは以下のとおりです。その人を見つけたすべての従業員を結果から削除します。

select * 
from emp 
left join emp less on less.department_id = emp.department_id and less.salary < emp.salary 
where less.employee_id is null; 

それはトリックだし、クエリが実際にやっているビットを難読化されていますので、あなたは通常、しかし、これをしないだろう。 NOT EXISTSはここではっきりしています。「少ない収入の同僚がいない従業員を私に教えてください。

またはrank() over partition by department_id order by salary(まあ、あなたのケースで、あなたも、このようなwhere (department_id, salary) in (select department_id, min(salary) ...として、完全に何か他のものを使用する場合があります)。)

しかし、アンチは、あなたのDBMSがnot existsクエリに弱い証明したときに解決されている加入します。彼らは同じことを書くための単なる別の方法です。

-1
SELECT D.employee_id,D.Last_name,MIN(D.salary),D.department_id 
    FROM [HelpDatabase].[dbo].[Employees] D 
    WHERE D.department_id IS NOT NULL 
    group by D.employee_id,D.Last_name,D.department_id 
+0

それは正しく動作しませんが、私はなぜそれがわかりません。 – Shady119

+0

employee_idでグループ化すると、各グループに1人の従業員が割り当てられます。 –

0
SELECT D.employee_id,D.Last_name,D.salary,D.department_id 
FROM [HelpDatabase].[dbo].[Employees] D, 
    (SELECT department_id, MIN(salary) min_salary 
     FROM [HelpDatabase].[dbo].[Employees] 
     WHERE department_id is not null 
     GROUP BY department_id) E 
WHERE D.department_id IS NOT NULL 
    AND D.salary=E.min_salary 
    AND E.department_id=D.department_id 

あなたはmin_salary取得する(DEPARTMENT_IDによってパーティション)上min_salaryを分(給与)を使用することができますが、それはまだサブクエリが生成されますし、あなたがその

+0

'E.department_id = D.department_id'がありません。またこれはサブクエリを使用します。 – Taemyr

+0

私は、正しく動作するようにそれを明確に追加しました。私のようなものではなく正しいと思われますが、それはまだ2つあります.1つではありません。 – Shady119

+0

不在のdepartment_idチェック、更新された回答 –

関連する問題