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_num1 order 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 查询缺少表达式的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 中的插入选择查询缺少表达式错误

带有 ORA-00936 的 SQL 查询实例:缺少表达式错误

ORA-00936: 缺少表达式解决方案 - 转换函数

ORA-00936: 缺少表达式 oracle

ORA-00936: Oracle 11g 中的 DELETE 语句和视图缺少表达式

Oracle 中 UPPER() 函数的约束,缺少表达式