Postgresql присоединиться к этой таблице (это, если не ноль или что) - PullRequest
0 голосов
/ 20 января 2019

Я схожу с ума по этому поводу некоторое время, и я уверен, что это проще, чем я сейчас делаю, но не могу найти ответ, вероятно, потому что я не могу указать правильный вопрос.

Я объясню на простом примере: допустим, у меня есть 3 таблицы

отцов:

| id  | name |

сыновей:

| id |father_id  | name |

книги:

| id  | son_id | father_id |name |

Я хочу запрос, который бы дал мне:

[father] | [son] | [book]

---------   ----   -----

father1| son1 | book1

father1 |son1 | book5

father1,son2,book2

father1,none,book3

father1,none,book4

father2...

У меня есть:

select fathers.name,sons.name,books.name 
from fathers left join sons on son.father_id=fathers.id 
left join books on ...

Цените любую помощь здесь!

Обновление:

Кажется, когда книга назначается сыну, она также назначается отцу.

вот мой текущий запрос:

select fathers.name,sons.name,books.name 
from 
    fathers 
    left join sons on son.father_id=fathers.id 
    left join books on (
        (books.father_id=fathers.id and books.son_id is null) 
        or ((books.son_id=sons.id )
    ) 
group by fathers.name,sons.name,books.name

Но это не дает мне условного «нет» в колонке сына.

1 Ответ

0 голосов
/ 20 января 2019

Ваша таблица сын уже имеет связь с таблицей папа , поэтому поле Father_id в таблице книга является дополнительным и избыточным, если книги только для сына, а не для отцов! В противном случае, если у обоих отцов и сыновей могут быть книги, вы должны left join book стол с обоими папа и сын стол; Я имею в виду, что запрос, который вы хотите, выглядит примерно так:

select f.name, s.name, b.name 
from  Books b left join fathers f on b.father_id=f.id
      left join sons s on b.son_id=s.id
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...