Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Умный bulk update  [new]
ice-pro
Member

Откуда:
Сообщений: 11
Доброго времени суток!

Помогите решить хитрую задачу.

1) Есть таблица new_entities, строк на 100 000.
И еще есть existing_entities (тоже большая, но ее трогать не будем).
2) Колонки у обеих следующие
id, start, end, name
Первый столбик - РК.
3) Пример данных new_entities такой:
1 A B null
2 A B null
3 D E null
4 D E null
5 D E null

Пример existing_entities
1 A B AB002
2 D E DE001

Нужно балково проапдейтить столбик name в таблице new_entities что бы получилось
name = start + end + первое еще не занятое число в последовательности *
* Но при формировании числа нужно опираться на существующие значения в existing_entities

Для вышеуказанного примера правильный результат следующий:
1 A B AB001
2 A B AB003
3 D E DE002
4 D E DE003
5 D E DE004

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

Прошу помощи в решении задачи.

Спасибо.
1 фев 13, 03:14    [13860000]     Ответить | Цитировать Сообщить модератору
 Re: Умный bulk update  [new]
123йй
Member

Откуда:
Сообщений: 1637
ice-pro,

автор
строк на 100 000

и попробуем
автор
Для вышеуказанного примера правильный результат следующий:
1 A B AB001
в 3 цифры
1 фев 13, 08:25    [13860101]     Ответить | Цитировать Сообщить модератору
 Re: Умный bulk update  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
ice-pro,
Увеличение значений в поле name должно идти в порядке возрастания id ? Т.е. будет ли корректным результат:

1 A B AB001
2 A B AB003
3 D E DE004
4 D E DE002
5 D E DE003
?
1 фев 13, 11:01    [13860631]     Ответить | Цитировать Сообщить модератору
 Re: Умный bulk update  [new]
ice-pro
Member

Откуда:
Сообщений: 11
123йй
ice-pro,

автор
строк на 100 000

и попробуем
автор
Для вышеуказанного примера правильный результат следующий:
1 A B AB001
в 3 цифры


Пар start-end будет не более 999.
1 фев 13, 12:00    [13860997]     Ответить | Цитировать Сообщить модератору
 Re: Умный bulk update  [new]
ice-pro
Member

Откуда:
Сообщений: 11
ten
ice-pro,
Увеличение значений в поле name должно идти в порядке возрастания id ? Т.е. будет ли корректным результат:

1 A B AB001
2 A B AB003
3 D E DE004
4 D E DE002
5 D E DE003
?


Да, такой вариант тоже корректен, главное - использовать минимальный незанятый номер.
1 фев 13, 12:01    [13861003]     Ответить | Цитировать Сообщить модератору
 Re: Умный bulk update  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
ice-pro,

1. строите множество Start,END,count в new_ent as c,max в old_ent as m
2. Делаете ему join s select from dual connect by level, где not exists из old ent с нпп не большим c и до тех пор пока level не больше m+c
3. Делаете выборку ROWID as r,row_number() over (partition by Start,end) as n из new end
4. Делаете update new_ent set name = Start||End||level из пункта 2, где нпп=n

Скорее всего овчинка выделки не стоит.
1 фев 13, 12:17    [13861113]     Ответить | Цитировать Сообщить модератору
 Re: Умный bulk update  [new]
ten
Member

Откуда: Екатеринбург
Сообщений: 1672
ice-pro,
В лоб, только в именах полей нижнее подчеркивание добавил :)
update new_entities n1
   set n1.name_ = 
     ( select n.start_ || n.end_ || 
              lpad( case
                      when e.NUM_ = n.RN then n.RC+1 ELSE n.RN
                    end, 3, '0') as new_name_
         from ( select nn.*
                     , row_number() over( partition by nn.start_, nn.end_ order by nn.id_) as RN
                     , count(*) over( partition by nn.start_, nn.end_ ) as RC
                  from new_entities nn ) n
              , (select ee.*, to_number(replace(ee.name_, ee.start_||ee.end_)) as NUM_
                  from existing_entities ee) e
        where n.start_ = e.start_ (+)
          and n.end_ = e.end_ (+)
          and n1.id_ = n.id_
     );
1 фев 13, 12:31    [13861206]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить