SQL在三个表中的至少两个表中查找匹配项-组合查询

SQL在三个表中的至少两个表中查找匹配项-组合查询,sql,join,Sql,Join,我有三个单独的查询,如果可能的话,我想合并成一个查询。目的是查找三个表中任意两个表中存在的用户。它们必须至少存在三个表中的两个 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 use

我有三个单独的查询,如果可能的话,我想合并成一个查询。目的是查找三个表中任意两个表中存在的用户。它们必须至少存在三个表中的两个

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的外键,该外键是[user]表的主键。

左侧外部联接将导致查询尝试联接表,但不要求该子表具有匹配的记录。如果没有匹配的记录,则该表中的字段将为空。这个查询应该满足您的需要

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)

左外部联接将导致查询尝试联接表,但不要求该子表具有匹配的记录。如果没有匹配的记录,则该表中的字段将为空。这个查询应该满足您的需要

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)

如果不想重组,请尝试以下查询:

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)

如果不想重组,请尝试以下查询:

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)

为什么要为用户使用三个表?是否可以合并这些表并添加一个user\u type\u id字段?这似乎是最直观的做事方式。您将消除每个表之间复制的所有数据。实际上,我猜您需要两个字段,一个用于查找/风险,另一个用于全职/不查找用户存在于[user]表中。其他每个表都是一个“作业”表,用于存储可能与用户关联的作业。我想知道如何在不改变数据模型的情况下做到这一点。这3个表的结构是什么?表的结构应该无关紧要,只是知道它们各自都有一个名为user_id的外键,这是[user]表的主键。为什么要为用户使用三个表?是否可以合并这些表并添加一个user\u type\u id字段?这似乎是最直观的做事方式。您将消除每个表之间复制的所有数据。实际上,我猜您需要两个字段,一个用于查找/风险,另一个用于全职/不查找用户存在于[user]表中。其他每个表都是一个“作业”表,用于存储可能与用户关联的作业。我想知道如何在不改变数据模型的情况下做到这一点。这3个表的结构是什么?表的结构应该不重要,除了知道它们每个都有一个名为user_id的外键,这是[user]表的主键。这是我想要的100%答案。非常感谢!这是100%的答案,我一直在寻找。非常感谢!