Sql 查找组合两个联接的记录

Sql 查找组合两个联接的记录,sql,postgresql,join,Sql,Postgresql,Join,我有三张桌子: 用户、房屋和房屋事件 房屋对用户具有外部密钥(用户id),房屋事件对房屋具有外部密钥(房屋id) 您可以在此处看到模式:- 我知道如何获得所有没有房子的用户: 从用户选择* u.user\u id=user.id上的左外部联接室u 其中u.user_id为空 但是,我怎样才能在一个查询中得到所有没有房子的用户和那些房子中至少有一个暂停事件的用户 因此,在这个例子中,我会得到Lee,因为他没有房子,我也会得到John,因为即使他有房子,它的一个房子也有一个相关的暂停事件。将两个

我有三张桌子:

用户、房屋和房屋事件

房屋对用户具有外部密钥(用户id),房屋事件对房屋具有外部密钥(房屋id)

您可以在此处看到模式:-

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


从用户选择*
u.user\u id=user.id上的左外部联接室u
其中u.user_id为空

但是,我怎样才能在一个查询中得到所有没有房子的用户和那些房子中至少有一个暂停事件的用户


因此,在这个例子中,我会得到
Lee
,因为他没有房子,我也会得到
John
,因为即使他有房子,它的一个房子也有一个相关的暂停事件。

将两个查询合并在一起

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


您无需使用
子查询
,只需使用
左连接
即可完成此操作查询如下:

    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

不错!为什么我们需要分组依据?@HommerSmith,我们在
JOIN
中使用
groupby
以避免显示重复的名称,很高兴它有帮助,如果这能解决您的问题,请标记为回答:)谢谢Japz,如果我想修改查询以获得那些没有房子的用户以及那些拥有上一次事件被拒绝的房子的用户(houseEvent中有一个日期列)@HommerSmith,我该怎么做?在这种情况下,您希望得到什么结果?
    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