oracle:别名问题,为什么不识别呢?

时间:2011-02-13 21:32:42

标签: sql oracle syntax aliasing

好的,我有一个真正的问题,试图理解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 个答案:

答案 0 :(得分:3)

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 :(得分:1)

如果可以更有效地写出来,可以提出马丁的问题。

我认为以下内容会更好,但仍会返回相同的内容:

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