Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 агрегация + агрегация  [new]
агрегация
Guest
Всем доброго дня, имею запрос:
SELECT CASE WHEN NVL(MAX(STATUS), '1') = 1 AND (SELECT NVL(MAX(DUMMY), 'X') FROM DUAL) = 'X' THEN 1 ELSE 2 END FROM USER_TRIGGERS WHERE TRIGGER_NAME = 'ИМЯ ТРИГГЕРА';
Запрос естественно очень упрощенный (за бортом остался другое использование status и табличка естественно не dual). Суть этой части: вернуть 1, если триггера нет и скаляр "from dual" вернул определенное значение (при этом в таблице аля-дуал запись может быть или не быть).

Этот запрос возвращает ORA-00937 (не групповая операция). В принципе понятно, что именно у Оракла не сростается, но непонятно - это так и должно быть согласно какому-то ограничению или баг?

И можно ли как-то переписать , чтобы заработало (не разворачивая подзапросик с аля-дуал на уровень основного запроса).

Если переписать, например, так:
SELECT CASE WHEN NVL(MAX(STATUS), '1') = 1 AND max((SELECT NVL(MAX(DUMMY), 'X') FROM DUAL)) = 'X' THEN 1 ELSE 2 END FROM USER_TRIGGERS WHERE TRIGGER_NAME = 'ИМЯ ТРИГГЕРА';
, то ошибка меняется на совсем мне непонятную "invalid_number"
29 май 13, 12:23    [14364005]     Ответить | Цитировать Сообщить модератору
 Re: агрегация + агрегация  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
агрегация,

разумется, нет никакого бага. обычные грабли из песочницы детского сада.
в агрегативном запросе все столбцы должны быть:
1) либо из списка группировки
2) либо результатом групповой функции
(ну еще допустимы мелкие брызги - псевдостолбцы, литералы, константные выражения, некоторые sql-функции от 1) 2),
но, по большому счёту - можете считать - 1) 2) и только то.
кстати, оракл тут не при чём. чистая логика
29 май 13, 12:36    [14364078]     Ответить | Цитировать Сообщить модератору
 Re: агрегация + агрегация  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
агрегация
Если переписать, например, так:
SELECT CASE WHEN NVL(MAX(STATUS), '1') = 1 AND max((SELECT NVL(MAX(DUMMY), 'X') FROM DUAL)) = 'X' THEN 1 ELSE 2 END FROM USER_TRIGGERS WHERE TRIGGER_NAME = 'ИМЯ ТРИГГЕРА';
, то ошибка меняется на совсем мне непонятную "invalid_number"


Ы?
SELECT max(dummy, 'X')
    FROM dual;

Error at Command Line:1 Column:8
Error report:
SQL Error: ORA-00909: invalid number of arguments
00909. 00000 -  "invalid number of arguments"
29 май 13, 13:17    [14364331]     Ответить | Цитировать Сообщить модератору
 Re: агрегация + агрегация  [new]
123йй
Member

Откуда:
Сообщений: 1635
Максим Н,

а ничего, что у max один аргумент ?
29 май 13, 13:27    [14364404]     Ответить | Цитировать Сообщить модератору
 Re: агрегация + агрегация  [new]
Максим Н
Member

Откуда: Екатеринодар
Сообщений: 1439
123йй
Максим Н,

а ничего, что у max один аргумент ?


Пардон, заработался...
29 май 13, 13:48    [14364577]     Ответить | Цитировать Сообщить модератору
 Re: агрегация + агрегация  [new]
агрегация
Guest
orawish
(ну еще допустимы мелкие брызги - псевдостолбцы, литералы, константные выражения, некоторые sql-функции от 1) 2)
Ну казалось бы, что подзапрос, не зависящий от полей основного, вполне в ранге "мелких брызг" мог бы быть ) Вполне себе константная штука..
29 май 13, 14:30    [14364815]     Ответить | Цитировать Сообщить модератору
 Re: агрегация + агрегация  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
агрегация
orawish
(ну еще допустимы мелкие брызги - псевдостолбцы, литералы, константные выражения, некоторые sql-функции от 1) 2)
Ну казалось бы, что подзапрос, не зависящий от полей основного, вполне в ранге "мелких брызг" мог бы быть ) Вполне себе константная штука..

а вот и нэт ;)
если вам надо поиграться с результатом агрегации - играйтесь запросом from (запрос с агрегацией)
29 май 13, 14:41    [14364894]     Ответить | Цитировать Сообщить модератору
 Re: агрегация + агрегация  [new]
агрегация
Guest
агрегация
Если переписать, например, так:
SELECT CASE WHEN NVL(MAX(STATUS), '1') = 1 AND max((SELECT NVL(MAX(DUMMY), 'X') FROM DUAL)) = 'X' THEN 1 ELSE 2 END FROM USER_TRIGGERS WHERE TRIGGER_NAME = 'ИМЯ ТРИГГЕРА';
, то ошибка меняется на совсем мне непонятную "invalid_number"
Вот ведь блин!!! :) Всё работает, если второй max поставить - моя невнимательность при переписывании :( Ещё бы он смог это привести к number :))
29 май 13, 14:47    [14364937]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить