当前位置: 首页 > 知识库问答 >
问题:

SQL命令未正确结束WHERE语句

鲁展
2023-03-14

有了这句话:

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

为什么会出现这个错误:

第1行出错:
ORA-00933:SQL命令未正确结束从站点按长度排序(城市)选择城市,长度(城市),其中ROWNUM=1

共有3个答案

朱起运
2023-03-14

这是正确的语法。

SELECT CITY, LENGTH(CITY) 
FROM STATION 
WHERE ROWNUM = 1
ORDER BY LENGTH(CITY) ;
法和安
2023-03-14

如果您使用的是Oracle 12c,而不是ROWNUM,您还可以使用FETCH FIRST子句:

create table station (
  city varchar2(200)
);
insert into station (city) values ('New York');
insert into station (city) values ('Rio');
insert into station (city) values ('Tokyo');


select city, length(city)
from station
order by length(city)
fetch first 1 rows only
;
-- Rio 3  

尤其是如果您不希望前N行按某种标准排序,但下N行也在以后的调用中排序。那么OFFSET x ROWS FETCH NEXT x ROWS ONLY比嵌套的ROWNUMs更容易使用。

详见http://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702(Ctrl-F"row_limiting_clause")。

姚骁
2023-03-14

你可能想要这个:

select * from (
    SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY)
) WHERE rownum = 1;

您的查询中有一个语法错误,因为ORDER BYWHERE子句之后。因此,在修复语法错误后,您将得到这个:

SELECT CITY, LENGTH(CITY) 
FROM STATION
WHERE ROWNUM = 1
ORDER BY LENGTH(CITY)

如果您还记得,WHERE子句是在ORDER BY子句之前计算的。因为,ROWNUM pseudocolumn返回一个数字,指示Oracle从一个表或一组连接行中选择行的顺序。选定的第一行的ROWNUM值为1,第二行的值为2,依此类推。ROWNUM返回值1,2,3,。。。根据从表获取数据的顺序(可以是任何顺序),这可能不是您想要的。

如果在子查询中嵌入ORDER BY子句,并将ROWNUM条件放在顶级查询中,则可以在对行排序后强制应用ROWNUM条件。

所以,你可以这样问:

select * from (
    SELECT CITY, LENGTH(CITY) FROM STATION ORDER BY LENGTH(CITY)
) WHERE rownum = 1;

在这种情况下,首先根据子查询中城市列内容的长度对行进行排序,然后按照城市列长度的递增顺序应用ROWNUM。因此,现在可以使用ROWNUM=1谓词筛选出第一行。

或者,在Oracle database 12c及更高版本中,您可以使用FETCH FIRST N ROWS ONLY子句来简化您的工作(无需子查询)。

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

在完成排序并返回最上面的一行后,将对该子句进行求值。

 类似资料:
  • 问题内容: 相当基本的sql命令。只想从我正在遍历的不同表中获取计数。但是,如果我更改sqlCommand并添加“;” 最后我得到异常,SQL命令未正确结束。 我很好奇为什么分号会引发此异常,因为命令应该以“;”结尾 问题答案: 半冒号通常仅用作sqlplus等交互式工具的命令终止符。

  • 我遇到了一个甲骨文错误, ORA-00933:SQL命令未正确结束 有以下几点。 我在每个语句末尾的“/”前面加了分号。 有什么建议我可能错了吗?

  • 我试图从MySQL移动到Oracle和我的一个查询最初看起来像这样 然而,当我在ORACLE中运行同一个查询时,只做了一个小改动。。。 它给了我以下错误: SQL错误:ORA-00933:SQL命令未正确结束00933。00000-“SQL命令未正确结束” Oracle SQL Developer工具强调了声明部分的一个问题 作为t1 我读了一些其他的问题,提到在Oracle语句的某些部分周围放置

  • 问题内容: 当我输入这个 我收到关注错误 ORA-00933:SQL命令未正确结束 问题答案: 在Oracle中,您不能像这样指定多组值(我猜您来自允许该语法的MySQL背景)。最简单的方法是生成多个语句 您还可以使用单个语句插入多行

  • 我正在尝试创建一个where子句作为参数传递给Oracle命令,事实证明这比我想象的要困难得多。我想做的是根据应用程序中的用户输入创建一个大型where查询。其中query是语句的单个参数,并且将包含多个and、OR条件。但这里的代码并不完全符合我的要求: 如果我将下面的行更改为我想要的结果类型,那么我会得到一个错误"ORA-00933:SQL命令未正确结束": 我的问题是,如何在不导致此错误的情

  • 目的是仅当同一个表中不存在相同的记录时,才将记录插入表中。所以,我将该表的值存储在如下游标中:- 现在,我将使用如下的内部联接从表中删除记录- 执行此删除语句时,我收到错误-'ORA-00933:SQL命令未正确结束' 如果我能够从表中删除记录,我将使用以下代码从游标数据中插入相同的记录到相同的表中:- 我的目标是,仅当同一个表中不存在相同的记录时,才将记录插入表中。 请指导如何处理delete语