2012-10-02 190 views
0

我有三个单独的查询,我想如果可能的合并成一个单一的查询。目的是找到存在于三个表中任何两个中的用户。它们必须至少存在于三张桌子中的两张桌子上。SQL查找匹配 - 合并查询

user (user table) 
user_job_ft_job (full time job) 
user_job_own_venture (startup/own venture) 
user_job_not_looking (not seeking employment) 

-- not seeking and full time 
SELECT * from user_job_not_looking ujnl, user_job_ft_job uj, [user] u 
WHERE 1=1 
AND ujnl.user_id = u.user_id 
AND uj.user_id = u.user_id  

-- own venture and full time 
SELECT * from user_job_own_venture ujov, user_job_ft_job uj, [user] u 
WHERE 1=1 
AND ujov.user_id = u.user_id 
AND uj.user_id = u.user_id 

-- own venture and not looking 
SELECT * from user_job_own_venture ujov, user_job_not_looking ujnl, [user] u 
WHERE 1=1 
AND ujov.user_id = u.user_id 
AND ujnl.user_id = u.user_id 

我想这些查询某种方式合并成一个大的查询,这样我可以更轻松地编写动态代码来处理这一商业案例。

的表的结构并不重要,比知道它们都具有称为USER_ID外键它是[用户]表的主键等。

+1

为什么要用三个表的用户?是否有可能只是结合表格并添加一个user_type_id字段?这看起来是最直观的做事方式。您将消除每个表格之间的所有复制数据。 –

+0

其实我想你会需要两个领域,一个是寻求/风险,另一个全职/ notlooking –

+0

的用户在[用户]表中。每个其他表是一个“作业”表,用于存储可能与用户关联的作业。我想知道如何在不更改数据模型的情况下执行此操作。 –

回答

1

左外连接会导致查询尝试加入桌子上,但不要求孩子表有一个匹配的记录。如果没有匹配的记录,从该表中的字段将是空。这个查询应该做你需要的。

select * from [user] u 
left outer join user_job_not_looking as ujnl on ujnl.user_id=u.user_id 
left outer join user_job_own_venture as ujov on ujov.user_id=u.user_id 
left outer join user_job_ft_job as uj on uj.user_id=user_id 
where 
(ujnl.user_id is not null and ujov.user_id is not null) or 
(ujnl.user_id is not null and uj.user_id is not null) or 
(ujov.user_id is not null and uj.user_id is not null) 
+0

这是100%的回答我所期待的。感谢一大堆! –

+0

该死的,殴打一拳。 –

2

如果你不想重组,尝试这样的查询:

SELECT 
    * 
FROM 
    user 
    FULL JOIN user_job_not_looking AS ujnl ON ujnl.user_id = user.user_id 
    FULL JOIN user_job_own_venture AS ujov ON ujov.user_id = user.user_id 
    FULL JOIN user_job_ft_job AS ujfj ON ujfj.user_id = user.user_id 
WHERE 
    (ujnl.user_id IS NOT NULL AND ujov.user_id IS NOT NULL) OR 
    (ujnl.user_id IS NOT NULL AND ujfj.user_id IS NOT NULL) OR 
    (ujov.user_id IS NOT NULL AND ujfj.user_id IS NOT NULL) 
+0

是的,这工作了。看起来不错!谢谢。 –