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

时间:2012-12-18 02:59:03

标签: 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

我想编写一个查询,返回三个作业表中任何一个中存在的所有用户。最好的方法是什么?如果可能的话,我宁愿在WHERE EXISTS上使用LEFT JOINS,但会对最好的解决方案感到满意。

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

2 个答案:

答案 0 :(得分:2)

使用LEFT JOIN,您只需要在至少一个表格中验证user_idNOT NULL

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个类似的表。

示例: http://sqlfiddle.com/#!2/2cd2c/1

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

答案 1 :(得分:1)

你可以这样做:

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);

SQL Fiddle Demo