0

可能であれば、1 つのクエリに結合したい 3 つの個別のクエリがあります。目的は、3 つのテーブルのうち任意の 2 つに存在するユーザーを見つけることです。3 つのテーブルのうち少なくとも 2 つに存在する必要があります。

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   

これらのクエリを何らかの方法で 1 つの大きなクエリに結合して、このビジネス ケースを処理する動的コードを簡単に記述できるようにしたいと考えています。

[user] テーブルの主キーである user_id と呼ばれる外部キーがすべてあることを除けば、テーブルの構造は重要ではありません。

4

2 に答える 2

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)
于 2012-10-02T21:41:45.787 に答える
1

左外部結合により、クエリはテーブルで結合を試みますが、その子テーブルに一致するレコードが必要ではありません。一致するレコードがない場合、そのテーブルのフィールドは 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)
于 2012-10-02T21:32:57.880 に答える