SQL Join包含和独占

时间:2013-01-24 15:41:30

标签: sql join left-join

我正在尝试创建一个包含以下条件的表中记录的查询:

包括:

  1. 用户在作业表中有记录。
  2. 用户在作业表中有一个NULL join_date或记录
  3. 不包括

    1. 用户在作业表中没有记录和NOT NULL join_date
    2. 这是我的架构:

      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
      

2 个答案:

答案 0 :(得分: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

这将为每个用户返回多行,每个作业一行。如果用户可以多次列出单个作业,则只需要distinct

或者,如果您愿意:

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实际上只是外连接的特例。

答案 1 :(得分:0)

Sql Fiddle Demo

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