【问题标题】:Missing Expression for the Oracle queryOracle 查询缺少表达式
【发布时间】: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 ()

标签: sql oracle window-functions


【解决方案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 已经存在于查询中

        【讨论】:

        • 不,它不起作用..尝试了上面的代码..得到与此函数缺少表达式相同的错误
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-08-31
        • 1970-01-01
        • 1970-01-01
        • 2016-04-14
        • 2012-09-23
        • 1970-01-01
        相关资源
        最近更新 更多