#mysql #sql
Вопрос:
У меня есть эта классическая проблема с sql How many copies of the book titled The Lost Tribe are owned by each library branch?
Я решил эту проблему, получив ветви, у которых есть копии, но есть ли способ получить все ветви, и это заполнит noOfCopies, которые содержат заголовок, и введите null, если нет? Я пробовал левое, внутреннее и правое соединения, но не смог этого понять.
select l.branchName, r.noOfCopies
from (tbl_library_branch as l
join tbl_book_copies as r
on l.branchId = r.branchId)
right join tbl_book as bk
on r.bookId = bk.bookId
where title in ('The Lost Tribe');
Комментарии:
1. Большинству людей
main table left join optional data
гораздо легче понять, чемoptional data right join main table
.2. Вы можете изучить операторы набора sql, такие как «объединение». Вы также можете рассмотреть функцию «если null» для замены нулевых значений нулями.
Ответ №1:
Вероятно, вам нужно что-то вроде следующего. Начните с таблицы, из которой вам требуются все строки, и присоединитесь к результату фильтрации вашей книги по названию:
select b.branchName, coalesce(c.noOfCopies,0) noOfCopies
from tbl_library_branch b
left join (
select bc.branchId, bc.noOfCopies
from tbl_book b
join tbl_book_copies bc on bc.bookId=b.bookId
where b.title = 'The Lost Tribe'
)c on c.branchId = b.branchId;
Комментарии:
1. Спасибо. Когда вы выполняете соединение слева, а затем (), это возвращает объединенную таблицу b и bc, которую мы называем c?
2. Да, терминология для этого является производной таблицей — результат этого запроса сам по себе считается таблицей для объединения.
3. потрясающе, еще раз спасибо!