在 Oracle SQL 查询中正确使用 ROWNUM
Proper usage of ROWNUM in Oracle SQL query
我想找到 city 和 length 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 中,然后在 WHERE
和 ROWNUM
上使用 WHERE
:
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;
这里是小DEMO
我想找到 city 和 length 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 中,然后在 WHERE
和 ROWNUM
上使用 WHERE
:
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;
这里是小DEMO