оракул: алиасинг проблема, почему ее не распознают? - PullRequest
1 голос
/ 14 февраля 2011

Хорошо, ребята, у меня есть реальная проблема, пытающаяся понять логику псевдонимов в Oracle. Вот запрос:

select isbn,
       b.fname,
       b.lname
from   bookauthor a,
       author b,
       (select authorid auth
        from   bookauthor
        where  isbn = (select max(isbn) maxisbn
                       from   orderitems))
where  b.authorid = auth
       and isbn = maxisbn;  

по какой-то причине dbms не распознает maxisbn как псевдоним, но если я избавлюсь от всего, что касается maxisbn, запрос запустится и распознает псевдоним "auth" просто отлично. Почему он видит одно, а не другое?

Ответы [ 2 ]

3 голосов
/ 14 февраля 2011

maxisbn не является именем какого-либо столбца, представленного списком SELECT вашей производной таблицы.

Чтобы этот синтаксис работал, вам необходимо добавить его в виде столбца, как показано ниже.

select isbn,
       b.fname,
       b.lname
from   bookauthor a,
       author b,
       (select authorid auth, isbn maxisbn
        from   bookauthor
        where  isbn = (select max(isbn) maxisbn
                       from   orderitems))
where  b.authorid = auth
       and isbn = maxisbn;  

Примечание: , вероятно, , безусловно, более эффективный способ написания этого запроса (вам не нужно дважды обращаться к bookauthor), и я всегда использовал бы явный синтаксис JOIN. Это просто ответ на ваш конкретный вопрос о том, почему это не работает.

1 голос
/ 14 февраля 2011

Чтобы ответить на вопрос Мартина, можно ли написать это более эффективно.

Я думаю, что следующее будет работать лучше и все равно вернет то же самое:

SELECT a.max_isbn,
       b.fname,
       b.lname
FROM  (SELECT authorid as max_authorid, 
              isbn as max_isbn
       FROM bookauthor
       WHERE isbn = (SELECT max(isbn) FROM orderitems)) a
  JOIN author b ON a.max_authorid = b.authorid AND a.max_isbn = b.isbn
...