Oracle: Как обновить каждую строку в таблице в процедуре, если строки сгруппированы? - PullRequest
0 голосов
/ 07 февраля 2019

Представьте, что у меня есть таблица с дубликатами (я упростил задачу и данные): enter image description here

Моя процедура с параметром Parent_id проходит через каждую строку и находит значение дляСтолбец «Совпадение» в другой таблице.

Моя процедура занимает около 8 секунд, чтобы найти значение для столбца «Совпадение».Обычно есть тысячи строк.Так что для завершения задачи требуются часы.

Проблема в том, что я должен добавлять значение к каждой строке, которую имею.Даже если эти строки повторяются.Если бы я мог сгруппировать эти строки в курсоре, это сэкономит до 70% времени.Но как я могу обновить значение «Совпадение» в каждой строке, если используется GROUP BY ?: enter image description here

Ответы [ 2 ]

0 голосов
/ 07 февраля 2019

Похоже, вы могли бы просто выполнить обновление, используя значения группировки в качестве ключа.

По существу, для каждой строки, возвращаемой курсором, выполните что-то вроде:

UPDATE table SET matched = the_cursor.matched
  WHERE parent_id = the_cursor.parent_id
    AND name = the_cursor.name
    AND address = the_cursor.address

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

Но, как уже упоминалось в комментариях, все это поднимает более крупный вопрос - действительно ли вам нужно сделатьэта строка за строкой, или вы можете использовать одну инструкцию MERGE или UPDATE для обновления всей таблицы?

0 голосов
/ 07 февраля 2019

Вы можете использовать listagg() аналитическую функцию как

with tab(id,parent_id,name,address ) as
(
 select 1, 1,'Ann' ,'Moscow' from dual union all
 select 2, 1,'Ann' ,'Moscow' from dual union all
 select 3, 1,'Pavel','Tula'  from dual union all
 select 4, 3,'Nikita','Ufa'  from dual union all
 select 5, 3,'Nikita','Ufa'  from dual
)
select parent_id,name,address, to_number(listagg(id) within group (order by id desc)) 
    as matched
  from tab
 group by parent_id,name,address

PARENT_ID   NAME     ADDRESS  MATCHED
 ---------  ------   -------  -------
    1        Ann     Moscow   21
    1        Pavel   Tula     1
    3        Nikita  Ufa      54
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...