使用WHERE语句未正确结束SQL命令

时间:2017-01-20 20:37:01

标签: sql oracle

这句话:

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

为什么我会收到此错误:

  

第1行的错误:
  ORA-00933:SQL命令未正确结束SELECT CITY,LENGTH(CITY)FROM STATION ORDER BY LENGTH(CITY)ROWNUM = 1

3 个答案:

答案 0 :(得分:6)

你可能想要这个:

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

您的查询中存在语法错误,因为ORDER BY位于WHERE子句之后。因此,在修复语法错误后,您将获得此信息:

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

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

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

所以,你的查询就变成了这个:

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

在此,首先根据子查询中CITY列的内容长度对行进行排序,然后按CITY列长度的递增顺序应用ROWNUM。因此,现在您可以使用ROWNUM = 1谓词过滤掉第一行。

或者,在Oracle数据库12c及更高版本中,您可以使用FETCH FIRST N ROWS ONLY子句使您的生活更轻松(无需子查询)。

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

在完成订购后将对此子句进行评估,并返回前一行。

答案 1 :(得分:2)

如果您使用的是Oracle 12c,而不是CSS first html,body, div, dir, pre { display: block; unicode-bidi: embed; } BDO[DIR="ltr"] { direction: ltr; unicode-bidi: bidi-override; } BDO[DIR="rtl"] { direction: rtl; unicode-bidi: bidi-override } *[DIR="ltr"] { direction: ltr; unicode-bidi: embed; } *[DIR="rtl"] { direction: rtl; unicode-bidi: embed; } body { font-family: arial; text-align: center; } .tooltip:hover { direction: rtl; unicode-bidi: bidi-override; unicode-bidi: embed; cursor: pointer; } .tooltip:hover:after { position: absolute; -webkit-transform: translateY(45px) translateX(30px); -moz-transform: translateY(45px) translateX(30px); transform: translateY(45px) translateX(30px); background: aquamarine; color: blue; border-radius: 5px; content: attr(tooltip); padding: 5px 12px 5px 12px; z-index: 13; width: auto; font-style: normal; font-size: 22px; white-space: nowrap; border: 3px solid blue; } .tooltip:hover:before { position: absolute; text-align: right; -webkit-transform: translateY(22px) translateX(-90px); -moz-transform: translateY(22px) translateX(-90px); transform: translateY(22px) translateX(-90px); content: "▲"; font-size: 32px; z-index: 13; color: blue; } Javascript next window.onload=function(){ document.getElementsByTagName("a")[0].setAttribute("class", "tooltip"); } and the html <a tooltip="supercalifragilisticexpialidocious">link element test</a> ,您还可以使用ROWNUM子句:

FETCH FIRST

特别是如果您不希望按某些标准排序前N行,但也要在后面的调用中接下来的N行。然后,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 比嵌套的OFFSET x ROWS FETCH NEXT x ROWS ONLY,IMO更容易使用。

有关详细信息,请参阅http://docs.oracle.com/database/121/SQLRF/statements_10002.htm#SQLRF01702(Ctrl-F&#34; row_limiting_clause&#34;)。

答案 2 :(得分:0)

这是正确的语法。

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