查找包含两个联接的记录

时间:2015-10-09 01:21:57

标签: sql postgresql join

我有三张桌子:

用户,众议院和众议院事件

House有一个foreign_key(user_id)给User,一个HouseEvent有一个foreign_key(house_id)到House

您可以在此处查看架构:http://sqlfiddle.com/#!9/f08db/5 -

我知道如何让所有没有房子的用户得到:

SELECT * FROM User LEFT OUTER JOIN House u ON u.user_id = user.id WHERE u.user_id IS NULL

但是我怎么能进入一个查询,所有没有房子的用户和那些有(至少)暂停事件的房子的用户。

所以,在这个例子中,我会得到Lee,因为他没有房子,我也会得到John,因为即使他有房子,其中一个房子也有关联暂停活动。

3 个答案:

答案 0 :(得分:1)

UNION 2个查询在一起?

SELECT u.id, u.name  FROM User u
JOIN House h ON h.user_id = u.id
JOIN HouseEvent he ON he.house_id = h.id AND he.name = 'suspended'
UNION
SELECT u.id, u.name FROM user u
LEFT JOIN house h ON h.user_id = u.id
WHERE h.user_id IS NULL

Fiddle

答案 1 :(得分:0)

SELECT * FROM User
Where id not in (SELECT user_id FROM House) OR
id in (select user_id from House h, HouseEvent he where he.house_id = h.id AND he.id = 2)

http://sqlfiddle.com/#!9/f08db/41

答案 2 :(得分:0)

您可以在不使用SUB QUERY的情况下执行此操作,只需使用LEFT JOIN这里是查询:

    SELECT User.name FROM User
    LEFT JOIN House h on h.user_id = user.id
    LEFT JOIN HouseEvent e on h.user_id = e.house_id
    WHERE h.user_id IS NULL OR e.name = 'suspended'
    GROUP BY User.name

I modified your SQL Fiddle