2014-09-08 2 views
0

У меня проблема с Oracle. У меня был SQL, где некоторые значения были исправлены. Теперь я начал заменять их значениями из таблицы параметров. Некоторые из этих фиксированных значений, где в NVL().Oracle Subselect в NVL (по требованию)

Проще говоря, мое заявление таково.

SELECT NVL(MAX(t.datefield), to_date('01011900','DDMMYYYY')) 
FROM table t; 

Это хорошо работает.

Теперь я хочу заменить фиксированную дату на дату из моей таблицы параметров с подзапросом, который не работает вообще.

// Works 
SELECT NVL(MAX(NULL), 'hello') FROM DUAL; 

// Doesn't work 
SELECT NVL(MAX(NULL), (SELECT 'hello' FROM DUAL)) FROM DUAL; 

Ошибка:

ORA-00937: .... "not a single-group group function" 

Я понятия не имею, как групповую подвыборки.

Любая помощь очень ценится! Благодаря!

ответ

1

Вы не можете группировать суб-выбор. Однако для достижения этого ваш суб-выбор будет иметь возможность возвращать только одну строку. Итак, замените его на картезианское объединение и группу.

SELECT NVL(MAX(NULL), str) 
    FROM DUAL 
CROSS JOIN (SELECT 'hello' as str FROM DUAL) 
GROUP BY STR 

В более общем каждом столбце, который не входит в общей функции сусла быть включен в GROUP BY. Плюс NVL() is bad; используйте вместо этого COALESCE() или CASE.

+0

Отлично- Спасибо миллион! Я не знаю, почему я так не думал об этом. С проблемой Nvl/Coalesce вы абсолютно правы, я просто использовал данный код. – Stix

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