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 为空的所有用户的结果,并且在作业表中没有记录。

这是我希望看到的 user_id 的结果集:

user_id
    101 <-- has a job
    103 <-- has a job
    104 <-- never joined, AND also does not have a job

我需要使用公用表表达式来执行此操作,还是可以在子查询中执行此操作?

请注意,为简洁起见,我省略了实际细节。这不是一个简单的内连接案例。

以下是我单独运行的每个查询:

这是返回正确结果的查询 #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

要获得`101, 103& 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 回答