在 Oracle SQL 查询中正确使用 ROWNUM

Proper usage of ROWNUM in Oracle SQL query

我想找到 citylength of city(即 CITY 一词中的字符数),其中 city 的长度在 table 中最大。如果我们有多个值,我们必须根据城市的字母顺序只取第一个值。

我观察到一件奇怪的事情:

SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY) DESC, CITY;

为我提供了正确的 table,所需的输出作为 Length(City) = 21 的第一行。但是,当我尝试使用

检索第一行时
SELECT CITY, LENGTH(CITY) FROM STATION WHERE ROWNUM = 1 ORDER BY LENGTH(CITY) DESC, CITY;

在 Oracle 中查询它给了我一些其他行,其中有 Length(City) = 12

请帮助我了解出了什么问题!另外仅供参考,只有一个值具有最大城市长度。

查询的 WHERE 子句在 ORDER BY 之前执行,因此 ROWNUM = 1 不是预期的行。您可以使用 FETCH FIRST ROW ONLY 代替:

SELECT CITY, LENGTH(CITY) 
FROM STATION 
ORDER BY LENGTH(CITY) DESC, CITY 
FETCH FIRST ROW ONLY;

... 或者您将语句放在子 select 中,然后在 WHEREROWNUM 上使用 WHERE

SELECT * 
FROM (
  SELECT CITY, LENGTH(CITY) 
  FROM STATION 
  ORDER BY LENGTH(CITY) DESC, CITY
)x WHERE ROWNUM = 1;

demo on dbfiddle.uk

rownum 工作得很好。 where 子句在 order by 之前处理。您可以改用子查询:

SELECT S.*
FROM (SELECT CITY, LENGTH(CITY)
      FROM STATION S
      ORDER BY LENGTH(CITY) DESC, CITY
     ) S
WHERE ROWNUM = 1 ;

或者,更好的是,使用已在 Oracle 中使用多年的 FETCH

SELECT CITY, LENGTH(CITY)
FROM STATION S
ORDER BY LENGTH(CITY) DESC, CITY
FETCH FIRST 1 ROW ONLY;

你也可以这样做:

select city, length_city
from ( SELECT CITY
              , LENGTH(CITY) length_city
              , row_number() over(order by LENGTH(CITY) DESC, CITY) rn
       FROM STATION)
where rn =1;

这里是小DEMO