SQL查找三个表中任何一个表中匹配的记录

SQL查找三个表中任何一个表中匹配的记录,sql,sql-server-2008,join,left-join,Sql,Sql Server 2008,Join,Left Join,我有以下模式: user -- user_id | first_name full_time_job -- ft_job_id | user_id part_time_job -- pt_job_id | user_id internship -- internship_id | user_id 我想编写一个查询,返回三个作业表中存在的所有用户。最好的方法是什么?如果可能的话,我更愿意在存在左连接的地方使用左连接,但是我会很乐意使用最好的工作解决方案 我不想返回三个作业表中都不存在的任何用户。

我有以下模式:

user -- user_id | first_name
full_time_job -- ft_job_id | user_id
part_time_job -- pt_job_id | user_id
internship -- internship_id | user_id
我想编写一个查询,返回三个作业表中存在的所有用户。最好的方法是什么?如果可能的话,我更愿意在存在左连接的地方使用左连接,但是我会很乐意使用最好的工作解决方案


我不想返回三个作业表中都不存在的任何用户。

使用
左联接
s,您只需验证
用户id
在至少一个表中是否为
非空

SELECT
  [user].user_id
FROM
  [user]
  /* LEFT JOIN against each of the 3 tables */
  LEFT JOIN full_time_job ft ON [user].user_id = ft.user_id
  LEFT JOIN part_time_job pt ON [user].user_id = pt.user_id
  LEFT JOIN internship intern ON [user].user_id = intern.user_id
WHERE
  /* And check that *any* of them has a non-null user_id */
  ft.user_id IS NOT NULL
  OR pt.user_id IS NOT NULL
  OR intern.user_id IS NOT NULL
如果可能,最好修复模式。。。 但从长远来看,如果可能的话,这些表都应该合并到一个表中,该表有一列指示作业类型,而不是3个类似的表

示例:

在上述示例中,3个表中的任何一个都不存在用户
5,6

您可以这样做:

SELECT DISTINCT *
FROM "user" 
WHERE user_id
IN
(
    SELECT user_id
    FROM
    (
       SELECT user_id FROM full_time_job
       UNION ALL
       SELECT user_id FROM part_time_job
       UNION ALL
       SELECT user_id FROM internship 
   ) t 
   WHERE user_id IS NOT NULL
)
或:使用CTE,可以这样编写:

;WITH AllUsers
AS
(
    SELECT user_id FROM full_time_job
    UNION ALL
    SELECT user_id FROM part_time_job
    UNION ALL
    SELECT user_id FROM internship 
)
SELECT *
FROM "user"
WHERE user_id IN ( SELECT user_id 
                   FROM AllUsers 
                   WHERE user_id IS NOT NULL);

我很喜欢这个答案,只是它的结果太多了。某些用户可能在一个或多个作业表中有匹配项。但无论如何,这是运行缓慢,并返回超过一百万的结果。应该接近750。我确实添加了distinct,这使数字降到了4000左右。@Adamlevit您的实现是什么?如果上的join
条件正确,则不应获得比预期更多的行。如果您缺少
子句上的任何
,您将得到笛卡尔积,这将导致您需要
不同的
。实际上,我剪切并粘贴了您的确切代码,我只是将表名与实际架构中的表名进行了交换。@AdamLevitt
user.user\u id
是唯一的/PK?仔细检查表名,尤其是在
子句上的
中,因为如果用户是唯一的,则不可能返回更多或重复的用户。是的,这肯定是用户表的唯一PK。奇怪,我知道。。。但绝对是独一无二的。同样为了完整性,也许您应该将[user]作为用户表,以避免人们的任何反对票。我亲眼目睹了这一切。