2017-01-30 3 views
2

Я действительно застрял в SQL-запросе из базы данных JustLee. НЕ Ищем кого-либо, чтобы сделать мою домашнюю работу, но, к сожалению, я застрял ...Использование традиционного предложения соединения с оператором (+)

Вопросы: Показать все авторы и книги, которые они написали. Включите авторов, которые еще не закончили писать свои книги. Укажите фамилию автора, имя автора, isbn и название книги. Используйте предложение традиционного соединения с оператором (+).

Моя догадка:

select lname, fname, isbn, title 
from author a, bookauthor ba, books b 
where a.authorid(+) = ba.authorid 
and ba.isbn(+) = b.isbn 
order by 1,2,3,4; 

Но я получаю столбец двусмысленно определенную ошибку. Любая помощь приветствуется. Благодаря!

+0

Неоднозначная колонка ISBN. Почему вы все равно должны его выбирать? Это всего лишь код; то, что вы действительно хотите, это название. – mathguy

+2

Не обижайтесь, но вы действительно должны найти другой учебник. Кто-то, предлагающий использовать старое, устаревшее и проприетарное '(+)' внешнее соединение в 2017 году (или 2016), не следует доверять. И они должны быть вынуждены прочитать руководство Oracle, потому что даже Oracle рекомендует прекратить использовать этот синтаксис. –

ответ

4

Вы должны квалифицировать имя неоднозначного столбца в SELECT списке:

select lname, fname, b.isbn, title 
from author a, bookauthor ba, books b 
where a.authorid(+) = ba.authorid 
and ba.isbn(+) = b.isbn 
order by 1,2,3,4; 

Это вообще хорошая практика, чтобы квалифицировать все столбцы выберите, если ничего другого, чем не дать понять, что таблица колонна прибывает из , Я также предлагаю вам перейти на современный JOIN синтаксис и список столбцов в явном виде в предложении ORDER:

select a.lname, a.fname, b.isbn, b.title 
from author a 
LEFT JOIN bookauthor ba 
ON a.authorid = ba.authorid 
LEFT JOIN books b 
and ba.isbn = b.isbn 
order by a.lname, a.fname, b.isbn, b.title; 
+0

Спасибо, это имеет большой смысл! Теперь я понимаю, что я должен различать, какой ISBN выбрать. Кроме того, меня не учат левому объединению, но я буду читать об этом в учебнике. – DNkG

+0

Уважаемый господин, - нотация Oracle для «левого внешнего соединения» имеет (+) на правой стороне равенства в предложении WHERE. И для соединения между «bookauthor» и «book» нет никакой возможной причины для соединения LEFT. – mathguy

+0

@mathguy Спасибо, исправлено. –

0

Один или несколько столбцов вы выбирающие существует в нескольких таблицах. Вы должны их квалифицировать.

Похоже, существует isbn столбец как в таблице books и bookauthor, поэтому вместо того, чтобы выбрать isbn, вы должны выбрать b.isbn или ba.isbn.

1

Если модель данных верна, то 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).

Смежные вопросы