我試圖讓數據庫中的用戶擁有數據庫中最大段的所有權。對此我試圖:Oracle SQL - 通過與ROWNUM中的having子句?
SELECT owner, MAX(bytes)
FROM SYS.DBA_SEGMENTS
GROUP BY owner
HAVING ROWNUM <= 1;
但是,這返回"not a GROUP BY expression"
。爲什麼我不能只選擇第一行?我該如何編寫這個查詢?謝謝!
我試圖讓數據庫中的用戶擁有數據庫中最大段的所有權。對此我試圖:Oracle SQL - 通過與ROWNUM中的having子句?
SELECT owner, MAX(bytes)
FROM SYS.DBA_SEGMENTS
GROUP BY owner
HAVING ROWNUM <= 1;
但是,這返回"not a GROUP BY expression"
。爲什麼我不能只選擇第一行?我該如何編寫這個查詢?謝謝!
你可以。在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;
謝謝,早期版本的作品。你知道爲什麼'HAVING ROWNUM <= 1;'不起作用嗎? –
我只在'SELECT'和'WHERE'子句中使用過'rownum'。它是一個由Oracle自己管理的僞列,所以語義有點不可思議。該文檔沒有提及'having'子句:https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm。 –
在早期版本中,你也可以使用(只是一個傳過來的數據):
select max(owner) keep (dense_rank last order by bytes nulls first) as owner,
max(bytes) as bytes
from sys.dba_segments;
'ROWNUM'被分配到各行來自行來源(在這種情況下是基表'DBA_SEGMENTS')。 「HAVING」是指由「GROUP BY」創建的組的屬性,而不是針對單個行。您不能在'HAVING'中使用'ROWNUM',而不是在可以使用'BYTES'或任何其他表達式的情況下,可以使用單個組中的行可能具有不同值的其他表達式。到底是什麼錯誤消息說。 – mathguy