|
Oracle 11 опция обязательной группировки по константам
|
|||
---|---|---|---|
#18+
Добрый день. Есть 2 сервера ORACLE. Версия на обоих: Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Есть простой запрос: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8.
На 1 сервере запрос выполняется без ошибок На 2 сервере запрос с ошибкой " ORA-00979: not a GROUP BY expression " - ругается на поле p.P1 - т.к. его нет в предложении group by и оно не в агрегирующей функции. Если же на 2 сервере в том же запросе поле p.P1 вставить в агрег. функцию и написать max(p.P1) - то все отрабатывает без ошибок. Поскольку на этих серверах стоит одинаковая версия ORACLE - возникло предположение что такое поведение регулируется какой-то настройкой. Вопрос какой и где? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2019, 07:31 |
|
Oracle 11 опция обязательной группировки по константам
|
|||
---|---|---|---|
#18+
Jaffar, 10053 ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2019, 07:41 |
|
Oracle 11 опция обязательной группировки по константам
|
|||
---|---|---|---|
#18+
Jaffar, Это Bug 5520732 Query with a missing GROUP BY item does not fail (no ORA-979) (ORA-00979 это корректное поведение) Запрос нужно переписать. В текущем виде работать будет с _fix_control 5520732:off или optimizer_features_enable<11.2.0.1 Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41.
... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2019, 21:45 |
|
Oracle 11 опция обязательной группировки по константам
|
|||
---|---|---|---|
#18+
SeaGateORA-00979 это корректное поведениеДля декларативного языка от перестановки мест групбаемых результат меняться не должен. Дока явно разрешает константы без указания в group bysqlreferenceIf you also specify a group_by_clause in this statement, then this select list can contain only the following types of expressions: Constants Aggregate functions and the functions USER, UID, and SYSDATE Expressions identical to those in the group_by_clause. If the group_by_clause is in a subquery, then all columns in the select list of the subquery must match the GROUP BY columns in the subquery. If the select list and GROUP BY columns of a top-level query or of a subquery do not match, then the statement results in ORA-00979. Expressions involving the preceding expressions that evaluate to the same value for all rows in a group ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2019, 22:17 |
|
Oracle 11 опция обязательной группировки по константам
|
|||
---|---|---|---|
#18+
-2-Для декларативного языка от перестановки мест групбаемых результат меняться не должен. Если речь о "group by a, b" и "group by b, a", то конечно, но я не вижу какая перестановка имеется в виду в контексте исходного запроса. -2-Дока явно разрешает константы без указания в group by p.P1 не является constant value , это column. SQL Language Reference говорит о том, что: SQL Language ReferenceIf the select list and GROUP BY columns of a top-level query or of a subquery do not match, then the statement results in ORA-00979. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.05.2019, 23:05 |
|
Oracle 11 опция обязательной группировки по константам
|
|||
---|---|---|---|
#18+
SeaGate-2-Для декларативного языка от перестановки мест групбаемых результат меняться не должен.Если речь о "group by a, b" и "group by b, a"Речь о месте декларации константы. От того, что она декларирована в подзапросе, не перестает быть константой. Но по факту может ора-979, а может и не может, как парсеру захочется переписать запрос: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
SeaGate SQL Language Reference говорит о том, что: SQL Language ReferenceIf the select list and GROUP BY columns of a top-level query or of a subquery do not match, then the statement results in ORA-00979. Columns of query это и константы, и любое выражение. Употребление "top-level query or subquery" бессмысленно, вообще приписка про ошибку при нарушении только одного из пунктов перечеркивает все остальные. Корявость формулировки обусловлена поздними безграмотными правками предыдущей редакции. Раньше было тоже корявенько, но именно про subquery и про ошибку наборот:авторExpressions identical to those in the group_by_clause. If the group_by_clause is in a subquery, then the GROUP BY columns of the subquery must match the select list of the outer query. Any columns in the select list of the subquery that are not needed by the GROUP BY operation are ignored without error. А еще раньше к фразе про идентичность приписок вообще не было. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2019, 08:26 |
|
Oracle 11 опция обязательной группировки по константам
|
|||
---|---|---|---|
#18+
-2-Речь о месте декларации константы. От того, что она декларирована в подзапросе, не перестает быть константой. Такой запрос Код: plsql 1.
всегда должен завершаться с ошибкой по следующим причинам: 1. он зависит от того, как оптимизатор трансформирует запрос, выполняет ли merge inline view или нет (materialize заменен на документированный no_merge). Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Произошла агрессивная оптимизация. Видится, что дешевле оптимизатору применить ряд трансформаций (simple view merging здесь), потом запустить семантическую проверку на корректность использования агрегатной функции, потом трансформировать дальше, чем запускать проверку на исходном запросе ("select x, count(*) from (select 123 x from dual)") и затем на трансформированном ("select 123 x, count(*) from dual"). 2. в текущей документации сказано, что он не должен работать (x есть в select list, однако не в GROUP BY columns): If the select list and GROUP BY columns of a top-level query or of a subquery do not match, then the statement results in ORA-00979. 3. если попробовать притянуть определение "Constants" к "x", то это не получается, т.к. дока пишет про constants в "this select list": If you also specify a group_by_clause in this statement, then this select list can contain only the following types of expressions: Constants В исходном примере "this select list" содержит некое поле "x" из inline view. Это не constant, соответственно, пункт про constants к этому запросу не может быть применен. Что не разрешено по доке, можно считать запрещенным. По поводу старой документации: старая документацияAny columns in the select list of the subquery that are not needed by the GROUP BY operation are ignored without error. "not needed" без детализации допускает слишком широкую трактовку, которая, помимо прочего, может включать: "select x, count(*) from (select 123 x from dual)". Текущая документация более строгая в этом плане, т.к. этого не содержит. Например, есть Functional Dependency . Конкретно, PostgreSQL позволяет поэтому вот такое: Код: plsql 1. 2. 3. 4. 5. 6. 7. 8. 9.
Что документировано здесь : 7.2.3. The GROUP BY and HAVING ClausesIf the products table is set up so that, say, product_id is the primary key, then it would be enough to group by product_id in the above example, since name and price would be functionally dependent on the product ID, and so there would be no ambiguity about which name and price value to return for each product ID group. Однако я не видел, чтобы Oracle когда-то это поддерживал, хотя "y" "not needed" (x уже primary key). Код: plsql Т.о. правильно сделали, что удалили это предложение из документации. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.05.2019, 22:30 |
|
|
start [/forum/topic.php?fid=52&fpage=77&tid=1882493]: |
0ms |
get settings: |
11ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
35ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
48ms |
get tp. blocked users: |
2ms |
others: | 17ms |
total: | 150ms |
0 / 0 |