0

次の条件でテーブルのレコードを含むクエリを作成しようとしています。

含まれるもの:

  1. ユーザーはジョブテーブルにレコードを持っています。
  2. ユーザーのjoin_dateがNULLであるか、ジョブテーブルにレコードがあります

除外する

  1. ユーザーのジョブテーブルにレコードがなく、NOTNULLjoin_dateがあります

これが私のスキーマです:

user --> user_id, join_date
job  --> job_id, user_id

user rows
user_id: 1, join_date: 1/24/13
user_id: 2, join_date: 1/24/13
user_id: 3, join_date: NULL
user_id: 4, join_date: NULL

job rows
job_id: 101, user_id: 1
job_id: 102, user_id: 3

ユーザー#1、#3、および#4を返すクエリを作成したいと思います。ユーザー#4を返さない次のクエリがあります。

SELECT DISTINCT u.[user_id], u.join_date, uj.job_id
FROM [user] u  
LEFT JOIN job uj ON (u.user_id = uj.user_id OR u.join_date is null)              
WHERE uj.user_id = u.user_id
4

2 に答える 2

2

inこれは、次のwhere句で使用するのが最も適切だと思います。

select *
from user u
where u.join_date is null or
      u.user_id in (select user_id from job)

仕事の情報も必要な場合は、次のように仕事の情報に参加できます。

select u.*, j.job_id
from user u left outer join
     job j
     on u.user_id = j.user_id
where u.join_date is null or j.user_id is not null

これにより、ユーザーごとに複数の行が返されます(ジョブごとに1つ)。distinct1つのジョブに対してユーザーを複数回リストできる場合にのみ必要です。

または、必要に応じて:

select *
from user u
where not (u.join_date is not null and
           u.user_id not in (select user_id from job)
          )

これは、除外ロジックによって行われます。

ちなみに、これinnot in実際には外部結合の特殊なケースにすぎません。

于 2013-01-24T15:44:48.983 に答える
0

SQLフィドルデモ

SELECT u.[user_id], u.join_date, uj.job_id
FROM [user] u  
LEFT JOIN job uj ON (u.user_id = uj.user_id) 
WHERE uj.job_id is null OR NOT u.join_date is null
于 2013-01-24T15:48:30.723 に答える