我试图从数据库中获取拥有最大段落所有权的用户。为此,我正在尝试:
SELECT owner, MAX(bytes)
FROM SYS.DBA_SEGMENTS
GROUP BY owner
HAVING ROWNUM <= 1;
然而,这会返回"not a GROUP BY expression"
。为什么我不能只选择第一行?我该如何编写此查询?谢谢!
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;
不起作用吗? - lte__SELECT
和WHERE
子句中使用过rownum
。它是一个伪列,由Oracle自己管理,因此语义有点奇怪并不令人惊讶。文档没有提到having
子句:https://docs.oracle.com/cd/B19306_01/server.102/b14200/pseudocolumns009.htm。 - Gordon Linoffselect 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
或任何可能对单个组内的行具有不同值的其他表达式一样。正如错误消息所说的那样。 - user5683823