0

私は次のテーブル構造を持っています:

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

以下を含むユーザーレコードの単一の結果セットを返したい:

  1. ジョブテーブルに一致するすべてのユーザーの結果。
  2. 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 
4

2 に答える 2

1

`101103&を取得するには104、次を試してください。

    select distinct u.user_id 
    from [user] u LEFT JOIN job j
    on u.user_id = j.user_id
    where (u.join_date is not null and j.job_id is not null)
          or u.join_date is null
于 2012-12-13T21:31:02.177 に答える
1

これはそれを行う必要があります:

select u.user_id from [user] u
left join job j on u.user_id = j.user_id
where j.job_id is not null or (j.job_id is null and u.join_date is null)

編集:これは論理的に同じで「より単純」ですが、最初の方法は問題のステートメントのように「読みます」:

select u.user_id from [user] u
left join job j on u.user_id = j.user_id
where j.job_id is not null or  u.join_date is null
于 2012-12-13T21:37:06.187 に答える