Уникальность названия проверяйте в Book, а число авторов — для конкретной книги. Группировка только по названию объединяет разные книги и может ошибочно суммировать их авторов.
Отбор уникальных названий книг, у которых более трёх авторов
Уникальность названия проверяйте в Book, а число авторов — для конкретной книги. Группировка только по названию объединяет разные книги и может ошибочно суммировать их авторов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В базе хранятся записи о книгах, однако названия могут повторяться. Необходимо изменить SQL‑запрос так, чтобы он выводил только те названия, которые встречаются единожды и к которым привязано более трёх различных авторов.
SELECT Bk.name
FROM BooksAuthor AS BA2
JOIN Author AS Auth ON BA2.author_id = Auth.id
JOIN Book AS Bk ON BA2.book_id = Bk.id
GROUP BY Bk.name
HAVING COUNT(DISTINCT Auth.id) > 3;
Ответ
Уникальность названия проверяйте в Book, а число авторов — для конкретной книги. Группировка только по названию объединяет разные книги и может ошибочно суммировать их авторов.
Вариант для непустых названий с учётом дублей связей:
WITH unique_names AS (
SELECT name
FROM Book
GROUP BY name
HAVING COUNT(*) = 1
)
SELECT b.name
FROM Book AS b
JOIN unique_names AS u ON u.name = b.name
JOIN BooksAuthor AS ba ON ba.book_id = b.id
JOIN Author AS a ON a.id = ba.author_id
GROUP BY b.id, b.name
HAVING COUNT(DISTINCT a.id) > 3;
Проверка COUNT(*) выполняется до соединения с авторами, поэтому число строк связей не искажает уникальность названия. Если NULL-названия допустимы, отдельно определите, нужно ли их включать и как сравнивать.