1

私はHRテーブルスキーマを使用しています。そこでは、次のような演習があります。

job_historyには、複数回雇用された従業員の複数のエントリを含めることができます。複数回雇用された従業員のリストを取得するクエリを作成します。列EMPLOYEE_IDLAST_NAMEFIRST_NAMEおよび集計を含めます"Times Hired"

私がこれまでに行ったことは次のとおりです。

select e.employee_id, e.last_name, e.first_name,
       count (start_date) as Times_Hired
from job_history jH, employees e
WHERE e.employee_id=jH.employee_id
group by e.employee_id, e.last_name, e.first_name;

さて、私の質問は次のとおりです。

  • 全体をサブクエリにする必要がありますか?
  • テーブルを接続する列job_historyemployees?

これを実行すると、少数の従業員のみが表示されるためです。

4

1 に答える 1

2

明確にするために、明示的な ANSI JOIN 構文を使用してクエリを書き直すことができます (また書き直す必要があります)。

SELECT employee_id, e.last_name, e.first_name,
       count (*) AS Times_Hired
FROM   employees   e 
JOIN   job_history j USING (employee_id)
GROUP  BY employee_id, e.last_name, e.first_name
HAVING count (*) > 1;

また、a を使用して、 (まだ)LEFT [OUTER] JOIN行がない結果に従業員を含めます。job_history
従業員のみに関心があるため、これは関係ありません..

複数回雇用されたよりも

この条件を で実装しましたHAVING count (*) > 1

あなたの2番目の質問について:明らかに、employee_id..

テーブルjob_historyemployees?を接続します。

( ) で結合する列名は両方のテーブルで同一であるため、 との等結合employee_idに単純化しました。USING

そして、count(*)の代わりにを使用します。これは、ができるcount (start_date)かどうかが宣言されていないためです。その場合、カウントに追加されません。start_dateNULL

最初の質問については、いいえ、ここにサブクエリは必要ありません。

代替JOIN構文ON

SELECT e.employee_id, e.last_name, e.first_name,
       count (*) AS Times_Hired
FROM   employees   e 
JOIN   job_history j ON j.employee_id = e.employee_id
GROUP  BY e.employee_id, e.last_name, e.first_name
HAVING count (*) > 1;

SQLfiddleで両方をテストしました。

于 2013-03-17T14:54:28.883 に答える