2014-01-29 3 views
1

Как преобразовать этот запрос в группу Oracle By. Я сталкиваюсь с проблемой при переносе приложения из базы данных MySQL в Oracle.Нужно преобразовать группу MySQL по запросу в oracle

SELECT j.id     AS j__id 
,  j.processing_office_id AS j__processing_office_id 
,  j.lga_id    AS j__lga_id 
,  j.created_at   AS j__created_at 
,  j.updated_at   AS j__updated_at 
,  j.created_by   AS j__created_by 
,  j.updated_by   AS j__updated_by 
,  j.deleted_at   AS j__deleted_at 
,  t.name     AS t__0 
,  t3.id     AS t3__1 
,  t3.name    AS t3__2 
FROM join_processing_office_state_lga j 
LEFT 
JOIN tbl_lga t 
ON  j.lga_id = t.id 
AND t.deleted_at IS NULL 
AND t.active_flag = 'Y' 
LEFT 
JOIN tbl_procesing_office t2 
ON  j.processing_office_id = t2.id 
LEFT 
JOIN tbl_state t3 
ON  t.state_id = t3.id 
AND t3.deleted_at IS NULL 
AND t3.active_flag = 'Y' 
WHERE t2.active_flag = 'Y' 
AND t2.active_flag = 'Y' 
AND j.deleted_at IS NULL 
GROUP 
BY  t.state_id 
ORDER 
BY  t3.name 
+0

Читайте это: http://rpbouman.blogspot.de/2007/05/debunking-group-by-myths.html и это: http://www.mysqlperformanceblog.com/2006/09/06/wrong- group-by-make-your-queries-fragile/чтобы понять, что было не так, ваш запрос MySQL. –

+0

Вы не можете запустить группу только одним столбцом. Если у вас нет столбца агрегата, вам нужно будет группировать все столбцы на выходе. В любом случае вам все равно придется группировать по всем столбцам, кроме столбца агрегата, поэтому ... Вам нужно либо изменить выход, либо написать другой запрос. – riverdog

ответ

1

Ваш запрос использует один столбец group by. В отличие от других платформ, таких как Sybase, Oracle требует, чтобы все отдельные элементы выбора встречались в group by или использовались в групповой функции, такой как sum, max и avg. Я считаю это требование хорошим; это делает исход запросов детерминированным. Для порта этот запрос в Oracle, обеспечить для каждого выбора элемента, который вы либо:

  • включить его в group by (ныне, что можно сделать с помощью псевдонима или полное выражение).
  • или включить его в групповую функцию, такую ​​как max.

Если вам нужны промежуточные итоги и т. Д., Пожалуйста, рассмотрите использование аналитических функций. Они позволяют указать другое окно, для которого что-то вычисляется. Или используйте grouping sets и тому подобное. Удачи!

+0

Спасибо Гвидо. Наконец ROW_NUMBER() OVER (PARTITION BY ORDER BY ) AS решил мою цель. – AkiShankar

Смежные вопросы