有了这个声明:
SELECT CITY, LENGTH(CITY)
FROM STATION
ORDER BY LENGTH(CITY)
WHERE ROWNUM = 1;
Run Code Online (Sandbox Code Playgroud)
为什么我会收到此错误:
第1行的错误:
ORA-00933:SQL命令未正确结束SELECT CITY,LENGTH(CITY)FROM STATION ORDER BY LENGTH(CITY)ROWNUM = 1
你可能想要这个:
select * from (
SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY)
) WHERE rownum = 1;
Run Code Online (Sandbox Code Playgroud)
您的查询中存在语法错误,因为ORDER BY它位于该WHERE子句之后.所以,在修复语法错误之后你会有这个:
SELECT CITY, LENGTH(CITY)
FROM STATION
WHERE ROWNUM = 1
ORDER BY LENGTH(CITY)
Run Code Online (Sandbox Code Playgroud)
如果您还记得,该WHERE条款在该ORDER BY条款之前进行了评估.因为,ROWNUM 伪列返回一个数字,表示Oracle从一个表或一组连接的行中选择行的顺序.选择的第一行的a ROWNUM为1,第二行的为2,依此类推.在ROWNUM返回值1,2,3,...总部设在从表中数据的顺序station被取出(可以按任意顺序排列),这可能不是你想要的.
如果将ORDER BY子句嵌入子查询中并将ROWNUM条件放在顶级查询中,则可以强制ROWNUM在排序行之后应用条件.
所以,你的查询变为:
select * from (
SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY)
) WHERE rownum = 1;
Run Code Online (Sandbox Code Playgroud)
在此,首先根据子查询中CITY列的内容长度对行进行排序,然后ROWNUM按CITY列长度的递增顺序应用.所以,现在你可以使用ROWNUM = 1谓词过滤出第一行.
或者,在Oracle数据库12c及更高版本中,您可以使用该FETCH FIRST N ROWS ONLY子句使您的生活更轻松(不需要子查询).
SELECT CITY, LENGTH(CITY)
FROM STATION
ORDER BY LENGTH(CITY)
FETCH FIRST 1 ROW ONLY;
Run Code Online (Sandbox Code Playgroud)
订购完成后将对此子句进行评估,并返回前一行.