2011-04-14 126 views
0
SELECT title, retail, (SELECT AVG(retail) 
       FROM books) 
FROM books 
WHERE retail < (SELECT AVG(retail) 
       FROM books) 

有没有办法将(选择AVG(零售) 从书籍中的一个)缩短为别名?如何避免在oracle中重复?

回答

4

试试这个:

SELECT * 
    FROM (
    SELECT title, retail, AVG(retail) OVER() avg_retail 
    FROM books 
    ) 
WHERE retail < avg_retail 

,或者使用WITH:

WITH dat AS 
(
    SELECT title, retail, AVG(retail) OVER() avg_retail 
    FROM books 
) 
SELECT * 
    FROM dat 
WHERE retail < avg_retail 
+0

我试图找到(http://www.oracle.com/pls/db102/search?word=over&tab_id=15&partno=)的解释,是否有直接链接或者可能是一个解释? – user490735 2011-04-14 21:36:05

+0

选中此项:http://download.oracle.com/docs/cd/B19306_01/server.102/b14223/analysis.htm#i1006928 – Chandu 2011-04-14 21:38:29

2

,你可以用WITH条款重构,也许是这样的:

With avg_retail as 
    (SELECT AVG(retail) the_avg 
    FROM books) 
SELECT title, retail, avg_retail.the_avg 
from books, avg_retail 
where books.retail < avg_retail.the_avg;