私は次のテーブル構造を持っています:
table: user
user_id | join_date
101 | '2012-4-13'
102 | '2012-6-4'
103 | NULL
104 | NULL
table: job
job_id | user_id
20 | 101
21 | 103
以下を含むユーザーレコードの単一の結果セットを返したい:
- ジョブテーブルに一致するすべてのユーザーの結果。
- join_dateがnullであり、ジョブテーブルにレコードがないすべてのユーザーの結果。
これが私が見たいuser_idの結果セットです:
user_id
101 <-- has a job
103 <-- has a job
104 <-- never joined, AND also does not have a job
Common Table Expressionsを使用してこれを行う必要がありますか、それともサブクエリでこれを行うことができますか?
簡潔にするために、実際の詳細は省略していることに注意してください。これは、内部結合の単純なケースではありません。
個別に実行されている各クエリは次のとおりです。
これは、#1の適切な結果を返すクエリです。
SELECT DISTINCT u.*
FROM [user] u, job uj
WHERE u.user_id = uj.user_id
これは、#2の適切な結果を返すクエリです。
SELECT DISTINCT u.*
FROM [user] u
FULL JOIN job uj ON u.user_id = uj.user_id
WHERE u.join_date IS NULL AND uj.user_id IS NULL