oraclesql查询中ROWNUM的正确使用

oraclesql查询中ROWNUM的正确使用,sql,database,oracle,oracle12c,Sql,Database,Oracle,Oracle12c,我想找到城市和城市长度(即单词city中的字符数),其中城市长度在表中是最大的。如果我们有多个值,我们必须根据城市的字母顺序只取第一个值 我观察到一件奇怪的事情: SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY) DESC, CITY; 给我一个正确的表格,其中所需的输出作为长度(City)=21的第一行。但是,当我尝试使用 SELECT CITY, LENGTH(CITY) FROM STATION WHERE ROWN

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

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

SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY) DESC, CITY;
给我一个正确的表格,其中所需的输出作为
长度(City)=21的第一行。但是,当我尝试使用

SELECT CITY, LENGTH(CITY) FROM STATION WHERE ROWNUM = 1 ORDER BY LENGTH(CITY) DESC, CITY;
在Oracle中查询它会给我提供另一行,该行的长度(City)=12


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

查询的
WHERE
子句在
ORDER BY
之前执行,因此
ROWNUM=1
不是预期的行。您可以使用
仅获取第一行

SELECT CITY, LENGTH(CITY) 
FROM STATION 
ORDER BY LENGTH(CITY) DESC, CITY 
FETCH FIRST ROW ONLY;
。。。或者您将语句放入子选择中,并在此子选择中使用
WHERE
ROWNUM

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

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;

这里有一个小的

Hi@AmitPathak,很高兴收到您的反馈。你可以接受正确的答案,如果一些答案不好,你可以发表评论,这样我们就可以知道为什么不好,然后尝试帮助更多。。。干杯您好@VBoka您能解释一下您使用的over关键字吗?Hi@AmitPathak这是我找到的,这样我就可以快速而有帮助地回答您:如果还不够,请告诉我