2016-11-05 107 views
3

我試圖讓數據庫中的用戶擁有數據庫中最大段的所有權。對此我試圖:Oracle SQL - 通過與ROWNUM中的having子句?

SELECT owner, MAX(bytes) 
FROM SYS.DBA_SEGMENTS 
GROUP BY owner 
HAVING ROWNUM <= 1; 

但是,這返回"not a GROUP BY expression"。爲什麼我不能只選擇第一行?我該如何編寫這個查詢?謝謝!

+1

'ROWNUM'被分配到各行來自行來源(在這種情況下是基表'DBA_SEGMENTS')。 「HAVING」是指由「GROUP BY」創建的組的屬性,而不是針對單個行。您不能在'HAVING'中使用'ROWNUM',而不是在可以使用'BYTES'或任何其他表達式的情況下,可以使用單個組中的行可能具有不同值的其他表達式。到底是什麼錯誤消息說。 – mathguy

回答

5

你可以。在Oracle 12c中+,你可以這樣做:

SELECT owner, MAX(bytes) 
FROM SYS.DBA_SEGMENTS 
GROUP BY owner 
ORDER BY MAX(bytes) DESC 
FETCH FIRST ROW ONLY; 

注意ORDER BY

在早期版本中,你需要一個子查詢:

SELECT o.* 
FROM (SELECT owner, MAX(bytes) 
     FROM SYS.DBA_SEGMENTS 
     GROUP BY owner 
     ORDER BY MAX(bytes) DESC 
    ) o 
WHERE rownum = 1; 
+0

謝謝,早期版本的作品。你知道爲什麼'HAVING ROWNUM <= 1;'不起作用嗎? –

+0

我只在'SELECT'和'WHERE'子句中使用過'rownum'。它是一個由Oracle自己管理的僞列,所以語義有點不可思議。該文檔沒有提及'having'子句:https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm。 –

1

在早期版本中,你也可以使用(只是一個傳過來的數據):

select max(owner) keep (dense_rank last order by bytes nulls first) as owner, 
     max(bytes) as bytes 
from sys.dba_segments;