ORA-00907: 缺少右括号

Posted

技术标签:

【中文标题】ORA-00907: 缺少右括号【英文标题】:ORA-00907: missing right parenthesis 【发布时间】:2011-11-03 02:02:22 【问题描述】:

我收到错误“ORA-00907:缺少右括号” 但我已经检查过了,所有的括号都在那里,所以我很难过。

我的查询是

SELECT 
  SUM(score) as score, 
  facebook_id, 
  firstname, 
  lastname, 
  dense_rank(score) 
WITHIN GROUP ( ORDER BY score ) as rank_db  
FROM 
  (
    SELECT DISTINCT *
    FROM 
      (
        SELECT *  
        FROM fanta_score 
        ORDER BY score desc
      ) as f 
    GROUP BY 
      facebook_id, game_id
  ) as g 
GROUP BY facebook_id
ORDER BY score DESC, created_at
LIMIT 50 

我绝不是 Oracle 专家,但我必须使用它,因为它必须在托管环境中。

【问题讨论】:

我认为这可能与限制语句有关??? 您是否尝试过注释掉查询的每一部分(内部/外部工作)并查看哪个语句特别会产生错误? 另外,这并不能真正解决您的问题,但您不希望在子查询中有 ORDER 子句。这将降低您的查询性能,因为一旦您排序,优化器就不能再使用索引,因为它必须展平结果集。当人们真的不需要 ORDER 时,他们通常会在子查询中进行 ORDER。 是的,我现在正在解决这个问题,但我没有本地 oracle 测试环境,所以这是一个乏味的过程。 distinct *GROUP BY facebook_id, game_id 在同一个选择中没有意义。此外,外部语句不起作用,因为您没有按所有非聚合列进行分组。 【参考方案1】:

LIMIT 命令在 Oracle 中无法识别。并且应该使用 ROWNUM 而不是 Limit

SELECT 
  SUM(score) as score, 
  facebook_id, 
  firstname, 
  lastname, 
  dense_rank(score) 
WITHIN GROUP ( ORDER BY score ) as rank_db  
FROM 
  (
    SELECT DISTINCT *
    FROM 
      (
        SELECT *  
        FROM fanta_score 
        ORDER BY score desc
      ) as f 
    GROUP BY 
      facebook_id, game_id
  ) as g
WHERE ROWNUM = 50 
GROUP BY facebook_id
ORDER BY score DESC, created_at

【讨论】:

我猜应该是 rownum 谢谢,我完全取消了限制,但仍然遇到同样的错误。 可能你可以这样指定,但如果你想写成 ROWNUM=50 也没问题 你能把“dense_rank(score) WITHIN GROUP (ORDER BY score) as rank_db”去掉再试试吗? 这个查询有很多问题。您有未按 (firstname, lastname) 分组的列,您在 order by (应该是 sum(score)) 中使用别名,我们无法判断您的子查询是否有效,因为“select *”,无论如何,在同一个查询中使用 distinct 和 group by 是什么?需要一些工作,但我不知道从哪里开始。

以上是关于ORA-00907: 缺少右括号的主要内容,如果未能解决你的问题,请参考以下文章

ORA-00907: 缺少右括号 00907. 00000 - “缺少右括号” *原因:*操作:行错误:44 列:30

ORA-00907: 缺少右括号

ORA-00907: 缺少右括号 -- 奇怪

错误:ORA-00907:oracle 缺少右括号

请帮助解决“ORA-00907:缺少右括号”错误

ORA-00907: 缺少右括号 2