SQL连接两次表,一次是外键匹配,然后是非匹配

时间:2012-12-13 21:26:51

标签: sql-server-2008 join common-table-expression multiple-tables

我有以下表结构:

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且AND在作业表中没有记录的所有用户的结果。
  3. 以下是我想看到的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 
    

2 个答案:

答案 0 :(得分:1)

获取`101103&amp; 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

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