我有以下表结构:
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
我想返回一个包含以下内容的用户记录结果集:
以下是我想看到的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
答案 0 :(得分:1)
获取`101
,103
&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