2011-02-13 37 views
1

好吧,我有一个真正的问题,试图了解oracle中别名背后的逻辑。下面是该查询: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; 

出于某种原因,数据库管理系统不能识别maxisbn作为别名,但如果我摆脱一切有关maxisbn,运行查询和识别别名“权威性”就好了。为什么看到一个而不是另一个?

回答

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; 

NB:有可能肯定写这个查询(你不应该需要访问bookauthor两次)的更有效的方式,我会一直使用显式JOIN语法。这只是回答你为什么不起作用的具体问题。

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