ORA-00907: отсутствует правая скобка

Я получаю сообщение об ошибке «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, но я должен использовать его из-за среды хостинга, в которой он должен находиться.


person ZaV    schedule 03.11.2011    source источник
comment
Я думаю, это может быть связано с заявлением о пределе ???   -  person ZaV    schedule 03.11.2011
comment
Вы пытались прокомментировать каждую часть запроса (работая внутри / снаружи) и посмотреть, какой оператор, в частности, вызывает ошибку?   -  person Jordan Parmer    schedule 03.11.2011
comment
Кроме того, это на самом деле не решает вашу проблему, но вы не хотите, чтобы в подзапросе было предложение ORDER. Это убьет производительность вашего запроса, потому что оптимизатор больше не сможет использовать индексы после сортировки, потому что он должен сгладить набор результатов. Люди часто будут ЗАКАЗАТЬ в подзапросе, когда им действительно не нужно ЗАКАЗАТЬ.   -  person Jordan Parmer    schedule 03.11.2011
comment
да, сейчас я работаю над этим, но у меня нет локальной тестовой среды Oracle, так что это утомительный процесс.   -  person ZaV    schedule 03.11.2011
comment
distinct * и GROUP BY facebook_id, game_id в одном и том же выборе не имеют смысла. Кроме того, внешний оператор не будет работать, поскольку вы не группируете все неагрегированные столбцы.   -  person a_horse_with_no_name    schedule 17.01.2013


Ответы (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
person PPShein    schedule 03.11.2011
comment
Я предполагаю, что должно быть rownum ‹= 50? Ваш запрос в том виде, в каком он написан, вернет ноль строк, верно? - person eaolson; 03.11.2011
comment
Спасибо, я полностью снял ограничение, но все равно получаю ту же ошибку. - person ZaV; 03.11.2011
comment
Возможно, вы можете указать это, но не проблема, если вы хотите указать как ROWNUM = 50 - person PPShein; 03.11.2011
comment
Можете ли вы удалить "density_rank" (оценка) ВНУТРИ ГРУППЫ (ORDER BY score) как rank_db и попробовать еще раз? - person PPShein; 03.11.2011
comment
Итак, я удалил его обратно и теперь получаю другую ошибку. ORA-00933: Команда SQL не завершена должным образом. Новый запрос; ВЫБРАТЬ СУММ (балл) как балл, facebook_id, имя, фамилия FROM (ВЫБРАТЬ DISTINCT * FROM fanta_score GROUP BY facebook_id, game_id) as g GROUP BY facebook_id ORDER BY score DESC, created_at - person ZaV; 03.11.2011
comment
вы забыли убрать запятую после фамилии? - person PPShein; 03.11.2011
comment
В настоящее время у меня на офисном компьютере нет PL / SQL, поэтому я не могу вам помочь. - person PPShein; 03.11.2011
comment
с этим запросом много проблем. У вас есть столбцы, по которым вы не группируете (имя, фамилия), вы используете псевдоним в порядке (должно быть сумма (оценка)), мы не можем сказать, действителен ли ваш подзапрос или нет из-за select *, и что это за использование отдельного и группового по в одном запросе? Нужна доработка, но я не знаю, с чего начать. - person Jim Hudson; 03.11.2011
comment
@ppshein: PL / SQL предназначен только для хранимых процедур. Но вы можете легко протестировать Oracle SQL здесь: sqlfiddle.com - person a_horse_with_no_name; 17.01.2013