Выбирать данные из трех таблиц, только если одна из них имеет ссылку на родительскую таблицу

У меня три стола человек, его машины, его дома. И мне нужно выбрать людей с его автомобилями и домами, если одна из дочерних (машина, дом) таблица имеет ссылку на родителя (человека).

Я пробовал с соединением, но не знаю, как использовать ИЛИ в этом состоянии.

Table person
id  name
1   Mark
2   David
3   Mike
4   Andrew

Table house
id  city        person
1   Moscow        1
2   Chicago       1
3   New York      2
4   Boston        2

Table car     
id   brand      person
1    bmw        4
2    opel       4
3    toyota     2
4    volvo      2

и результат должен быть

name    city              car
Mark   Moscow Chicago
David  New York Boston   toyota volvo
Andrew                   bmw opel

person Bogdan    schedule 04.11.2019    source источник


Ответы (1)


Вы можете left join дважды и убедиться, что одно из объединений выполнено успешно. Остальное - совокупность:

select 
    p.name, 
    string_agg(distinct h.city,  ' ' order by h.city) cities,
    string_agg(distinct c.brand, ' ' order by c.brand) brands
from person p
left join house h on h.person = p.id
left join car c on c.person = p.id
where c.person is not null or h.person is not null
group by p.id, p.name

Демонстрация DB Fiddle:

name   | cities          | brands      
:----- | :-------------- | :-----------
Mark   | Chicago Moscow  | null        
David  | Boston New York | toyota volvo
Andrew | null            | bmw opel    
person GMB    schedule 04.11.2019