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: 缺少右括号的主要内容,如果未能解决你的问题,请参考以下文章