缺少Oracle查询的表达式

时间:2015-09-02 10:15:26

标签: sql oracle window-functions

我正在尝试运行此查询,但我收到缺少表达式错误

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

你可以帮助我,在我出错的地方。

4 个答案:

答案 0 :(得分:2)

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足够聪明,可以在rownum子句中的其他条件之后评估WHERE表达式

答案 1 :(得分:1)

select star in Oracle(?)无法与其他explicite列结合使用。您需要使用子查询中的别名A限定星号。

 SELECT ROW_NUMBER() OVER(order by 'rownum') row_num1,
     A.*
  FROM A

这导致缺少表达式错误 - 之后您会看到其他错误

答案 2 :(得分:0)

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

&#34;和&#34; 的last where子句替换为查询中已存在的位置

答案 3 :(得分:0)

你必须添加一个别名,如果你还使用其他的名字或功能,就不能使用*而不是名字

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