LEFT JOIN с использованием таблицы ссылок в PostgreSQL

Есть таблицы people, people_has_book и books. Я хочу, чтобы все люди в моем списке, но не у всех есть книга, поэтому я использую LEFT JOIN для связывания people с people_has_book, но связывание people_has_book с книгами не должно быть LEFT JOIN.

Как мне это сделать?

Хорошо, если вам нужно сделать соединение между people_has_book и books внешним соединением, в противном случае дырочная «цепочка соединений» ведет себя как внутреннее соединение. Как вы думаете, почему вам не следует этого делать?

a_horse_with_no_name 27.11.2018 13:39

Не могли бы вы привести мне пример того, как вы бы это сделали?

DeniseMeander 27.11.2018 13:43
... from people p left join people_has_book phb on phb.people_id = p.id left join books b on phb.book_id = b.id
a_horse_with_no_name 27.11.2018 13:44

Я протестировал простой случай, и он действительно сработал, но я как-то заметил, что в более обширных случаях я получаю некоторые странные результаты, но я не уверен, в каких случаях это будет ... ;-)

DeniseMeander 27.11.2018 14:06
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
4
364
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать скобки для определения приоритета объединений. Нравится:

SELECT *
FROM   people p
LEFT   JOIN ( people_has_book pb JOIN books b USING (book_id) ) USING (people_id);

Это неуловимо разные от двух LEFT JOIN:

SELECT *
FROM   people p
LEFT   JOIN people_has_book pb USING (people_id)
LEFT   JOIN books b USING (book_id);

Последний будет отображать строки из people_has_book, даже если в books нет соответствующей записи. тем не мение, в классической реализации «многие ко многим» с ограничениями FK, обеспечивающими ссылочную целостность, обычно нет эффективной разницы для вашего конкретного запроса, поскольку все people_has_book.book_id в любом случае должны ссылаться на существующую строку в books - за экзотическим исключением значений NULL. (Если (people_id, book_id) является ПК people_has_book, оба столбца автоматически являются NOT NULL.)

Связанный:

Это оно! Спасибо!

DeniseMeander 27.11.2018 14:19

Другие вопросы по теме