3

次のスキーマがあります。

user -- user_id | first_name
full_time_job -- ft_job_id | user_id
part_time_job -- pt_job_id | user_id
internship -- internship_id | user_id

3 つのジョブ テーブルのいずれかに存在するすべてのユーザーを返すクエリを作成したいと考えています。これを行う最善の方法は何ですか?可能であれば、WHERE EXISTS よりも LEFT JOINS を使用したいと思いますが、最適なソリューションに満足しています。

3 つのジョブ テーブルのいずれにも存在しないユーザーを返したくありません。

4

2 に答える 2

2

sを使用すると、が少なくとも 1 つのテーブルにあるLEFT JOINことを確認するだけで済みます。user_idNOT NULL

SELECT
  [user].user_id
FROM
  [user]
  /* LEFT JOIN against each of the 3 tables */
  LEFT JOIN full_time_job ft ON [user].user_id = ft.user_id
  LEFT JOIN part_time_job pt ON [user].user_id = pt.user_id
  LEFT JOIN internship intern ON [user].user_id = intern.user_id
WHERE
  /* And check that *any* of them has a non-null user_id */
  ft.user_id IS NOT NULL
  OR pt.user_id IS NOT NULL
  OR intern.user_id IS NOT NULL

可能であればスキーマを修正するのが最善です...

ただし、長期的には、可能であれば、これらすべてを、3 つの同様のテーブルではなく、ジョブ タイプを示す列を持つ1 つのテーブルに結合する必要があります。

サンプル: http://sqlfiddle.com/#!2/2cd2c/1

上記の例では、ユーザー5,6は 3 つのテーブルのいずれにも存在しません。

于 2012-12-18T03:02:40.523 に答える
1

あなたはこれを行うことができます:

SELECT DISTINCT *
FROM "user" 
WHERE user_id
IN
(
    SELECT user_id
    FROM
    (
       SELECT user_id FROM full_time_job
       UNION ALL
       SELECT user_id FROM part_time_job
       UNION ALL
       SELECT user_id FROM internship 
   ) t 
   WHERE user_id IS NOT NULL
)

または: CTE を使用すると、次のように記述できます。

;WITH AllUsers
AS
(
    SELECT user_id FROM full_time_job
    UNION ALL
    SELECT user_id FROM part_time_job
    UNION ALL
    SELECT user_id FROM internship 
)
SELECT *
FROM "user"
WHERE user_id IN ( SELECT user_id 
                   FROM AllUsers 
                   WHERE user_id IS NOT NULL);

SQL フィドルのデモ

于 2012-12-18T03:03:33.270 に答える