Если модель данных верна, то authorid
должен быть первичным ключом в author
и внешним ключом в bookauthor
. Аналогичным образом, isbn
должен быть первичным ключом в books
и внешним ключом в bookauthor
. Вы, в основном, интересуетесь авторами, и, предположительно, у вас могут быть авторы, которые не написали никаких книг, поэтому возможно, что они будут в таблице author
, но не в таблице bookauthor
(хотя я бы спросил, почему они находятся в author
стол для начала). В заявлении о проблеме говорится, что «они еще не закончили писать свои книги», так что давайте покончим с этим.
Чтобы получить авторов, которые появляются только в author
таблице, но не в bookauthor
, вам нужно left outer join
между author
и bookauthor
. Использование Oracle запатентованного обозначения ((+)
обозначения), то (+)
должно быть на правой стороны равенства:
... from author a, bookauthor ba, books b
where a.authorid = ba.authorid(+)
and ba.isbn = b.isbn
Уведомления две вещей:
Для соединения слева (+) находится на право. Чтобы запомнить это: «внешнее» соединение создает «фиктивные» строки для значений authorid
, которые присутствуют в таблице слева, но в противном случае отсутствуют справа. Поэтому вам нужно добавить эти «выдуманные» или «мнимые» строки в таблицу справа (не слева). Таким образом, (+) находится справа.
Для isbn необходимо, чтобы внутреннее соединение было достаточным - в таблице bookauthor
не должно быть книги, которая не соответствует книге в таблице books
. (Конечно, нет, если таблицы имеют правильный внешний и первичный ключ, как описано выше.)
Примечания: Я бы очень подозрительно книгу, которая хочет, чтобы заставить вас, чтобы узнать старый, устаревший синтаксис (+) (и в более общем смысле «присоединить синтаксис к условиям в предложении WHERE» в отличие от современного, предпочтительного стандартного синтаксиса ANSI с использованием предложения ON или USING).
Неоднозначная колонка ISBN. Почему вы все равно должны его выбирать? Это всего лишь код; то, что вы действительно хотите, это название. – mathguy
Не обижайтесь, но вы действительно должны найти другой учебник. Кто-то, предлагающий использовать старое, устаревшее и проприетарное '(+)' внешнее соединение в 2017 году (или 2016), не следует доверять. И они должны быть вынуждены прочитать руководство Oracle, потому что даже Oracle рекомендует прекратить использовать этот синтаксис. –