Oracle 查询缺少表达式
Posted
技术标签:
【中文标题】Oracle 查询缺少表达式【英文标题】:Missing Expression for the Oracle query 【发布时间】:2015-09-02 10:15:25 【问题描述】:我正在尝试运行此查询,但收到缺少表达式错误。
SELECT *
FROM (
SELECT ROW_NUMBER() OVER(order by 'rownum') row_num1,
*
FROM A
WHERE refresh_date = (
SELECT max(refresh_date)
FROM A
WHERE upper(flaw_table_name) = upper('B')
)
)
WHERE row_num1 >= 1
AND row_num1 <=20
你能帮帮我吗,我哪里出错了。
【问题讨论】:
ROW_NUMBER 和 OVER() 之间似乎缺少逗号选择 ROW_NUMBER() OVER(order by 'rownum' 我尝试在 ROW_NUMBER 和 OVER() 之间添加逗号,但收到错误“缺少此函数的窗口规范” SELECT * from (select ROW_NUMBER(), OVER(order by 'rownum') row_num1,* from A where refresh_date = (Select max(refresh_date) from A where upper(flaw_table_name) = upper(' B') )) where row_num1>= 1 and row_num1order by 'rownum'
没有意义。您正在对 constant 值进行排序。与order by 42
相同。如果您不关心生成的数字,可以使用row_number() over ()
【参考方案1】:
order by
子句中有一个常量。此外,首先将rownum
放在那里是多余的。只需使用rownum
。
我想你想要:
SELECT A.*
FROM A
WHERE refresh_date = (SELECT max(refresh_date)
FROM A
WHERE upper(flaw_table_name) = upper('B')
) AND
rownum between 1 and 20;
子查询不是必需的,Oracle 足够聪明,可以在WHERE
子句中的其他条件之后评估rownum
表达式。
【讨论】:
【参考方案2】:选择星在 Oracle(?) 中无法与其他显式列组合。您需要在子查询中使用别名 A 来限定星号。
SELECT ROW_NUMBER() OVER(order by 'rownum') row_num1,
A.*
FROM A
这会导致缺少表达式错误 - 之后您会看到其他错误
【讨论】:
【参考方案3】:您必须添加别名,如果您还使用其他列名或函数,则不能使用没有名称的 *
SELECT *
FROM (SELECT row_number() over(ORDER BY 'rownum') row_num1,
t.*
FROM a t
WHERE refresh_date =
(SELECT MAX(refresh_date)
FROM a
WHERE upper(flaw_table_name) = upper('B')))
WHERE row_num1 >= 1
AND row_num1 <= 20
【讨论】:
【参考方案4】:SELECT * from (
select ROW_NUMBER() OVER(order by 'rownum') row_num1, * from A
where refresh_date = ( Select max(refresh_date)
from A
where upper(flaw_table_name) = upper('B')
)
) where row_num1>= 1 and row_num1<=20
用 "and" 替换最后一个 where 子句,因为 where 已经存在于查询中
【讨论】:
不,它不起作用..尝试了上面的代码..得到与此函数缺少表达式相同的错误以上是关于Oracle 查询缺少表达式的主要内容,如果未能解决你的问题,请参考以下文章
带有 ORA-00936 的 SQL 查询实例:缺少表达式错误