首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL连接表两次,一次使用外键匹配,然后使用不匹配

SQL连接表两次,一次使用外键匹配,然后使用不匹配
EN

Stack Overflow用户
提问于 2012-12-13 21:26:51
回答 2查看 133关注 0票数 0

我的表结构如下:

代码语言:javascript
复制
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的结果集,我希望看到:

代码语言:javascript
复制
user_id
    101 <-- has a job
    103 <-- has a job
    104 <-- never joined, AND also does not have a job

我是否需要使用公共表表达式来完成这个任务,还是可以在子查询中这样做?

请注意,为了简洁起见,我遗漏了实际的细节。这不是内部连接的简单情况。

下面是我的每个查询,它们分别运行:

这是返回#1的适当结果的查询。

代码语言:javascript
复制
SELECT DISTINCT u.*   
FROM [user] u, job uj
WHERE u.user_id = uj.user_id

这是返回#2的适当结果的查询。

代码语言:javascript
复制
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 
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-12-13 21:37:06

这应该可以做到:

代码语言:javascript
复制
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)

编辑:这在逻辑上是相同的,而且“更简单”,但第一种方式“读”像问题陈述:

代码语言:javascript
复制
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
票数 1
EN

Stack Overflow用户

发布于 2012-12-13 21:31:02

要获得`101103104,请尝试:

代码语言:javascript
复制
    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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13868755

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档