ОБНОВЛЕНИЕ с использованием ВНУТРИ ГРУППЫ

#oracle #group-by #listagg

#Oracle #группировка по #listagg

Вопрос:

Я написал приведенное ниже заявление, которое возвращает данные в формате, который мне нужен для обновления другой таблицы, однако я борюсь с обновлением

 SELECT element_id,
  LISTAGG(cast(0 as varchar2(20))||', '|| VALUE, ' | ') WITHIN GROUP (ORDER BY display_order)
FROM EDRN.MD$$_ELEMENT_VALUES
WHERE element_id IN
  (SELECT element_id FROM EDRN_NEW.DATA_DICTIONARY)
GROUP BY element_id;
  

Я выполнил базовое преобразование в инструкцию UPDATE

     UPDATE EDRN_NEW.DATA_DICTIONARY
SET Choices = (LISTAGG(CAST(0 AS VARCHAR2(20))||', '|| VALUE, ' | ') WITHIN GROUP (ORDER BY display_order)
FROM EDRN.MD$$_ELEMENT_VALUES
WHERE element_id IN
  (SELECT element_id FROM EDRN_NEW.DATA_DICTIONARY)
GROUP BY element_id);
  

При этом была получена ошибка «ORA-00934: групповая функция здесь не разрешена». Я не уверен, как удалить групповую функцию, но сохранить требуемый формат данных?

Ответ №1:

Для использования вам нужен подзапрос listagg() . В этом случае коррелированный подзапрос:

 update EDRN_NEW.DATA_DICTIONARY dd
    set choices = (SELECT LISTAGG(cast(0 as varchar2(20))||', '|| VALUE, ' | ') WITHIN GROUP (ORDER BY display_order)
                   FROM EDRN.MD$$_ELEMENT_VALUES ev
                   WHERE ev.element_id = dd.element_id
                  )
    where exists (select 1 
                  from EDRN.MD$$_ELEMENT_VALUES ev
                  where ev.element_id = dd.element_id 
                 );