好的,我有一个真正的问题,试图理解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”就好了。为什么会看到一个而不是另一个?
答案 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