Я могу понять, почему вы не знаете, с чего начать. В таких случаях я нахожу, что лучше начинать с малого и работать с подзапросами.
Чтобы найти книги, где данный автор не является единственным автор:
SELECT id_author, id_book
FROM (
SELECT id_author, id_book, COUNT(*) OVER (PARTITION BY id_book) AS author_cnt
FROM author_book
) WHERE author_cnt >= 2;
Чтобы получить Темы из вышеупомянутых книг:
SELECT ab2.id_author, bt.id_theme
FROM (
SELECT id_author, id_book, COUNT(*) OVER (PARTITION BY id_book) AS author_cnt
FROM author_book
) ab2, book_theme bt
WHERE ab2.author_cnt >= 2
AND ab2.id_book = bt.id_book;
Вы можете сделать то же самое для книг где автор является единственным автором:
SELECT ab1.id_author, bt.id_theme
FROM (
SELECT id_author, id_book, COUNT(*) OVER (PARTITION BY id_book) AS author_cnt
FROM author_book
) ab1, book_theme bt
WHERE ab1.author_cnt = 1
AND ab1.id_book = bt.id_book;
T курица вы можете использовать MINUS
, чтобы получить набор тем, где автор является единственным автором книги, но не те, где он является соавтором:
SELECT ab1.id_author, bt.id_theme
FROM (
SELECT id_author, id_book, COUNT(*) OVER (PARTITION BY id_book) AS author_cnt
FROM author_book
) ab1, book_theme bt
WHERE ab1.author_cnt = 1
AND ab1.id_book = bt.id_book
MINUS
SELECT ab2.id_author, bt.id_theme
FROM (
SELECT id_author, id_book, COUNT(*) OVER (PARTITION BY id_book) AS author_cnt
FROM author_book
) ab2, book_theme bt
WHERE ab2.author_cnt >= 2
AND ab2.id_book = bt.id_book;
вы пытались что-то? если да, покажите нам, если PLZ не попробует немного, прежде чем спросить – jfun