我有以下架构:
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中存在的任何用户。
答案 0 :(得分:2)
使用LEFT JOIN
,您只需要在至少一个表格中验证user_id
是NOT 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);