Обновление DB2 с порядковым номером, но увеличивается только при возникновении условия

У меня есть таблица, например

A      B          C         D
32     6100812    778899    123
32     6100812    778593    123
32     6100812    458962    123
33     8000812    885522    P111118
33     8000812    885537    P111118
32     6100915    990011    AA456
32     6100915    789684    AA456
32     6100915    485217    AA456

И нужно выполнить обновление столбца C, используя последовательный номер, который я могу создать с помощью функции DB2 create Sequence. Проблема в том, что мне нужно, чтобы число не увеличивалось, пока столбцы A и B не меняют свои значения.

Пока что у меня есть:

create sequence renumber
   start with 1
   increment by 1
   no maxvalue
   no cycle;

Update MYLIB.MYTABLE
Set
   C = 'SP' || lpad((nextval for renumber),5,'0') ;

drop sequence renumber;

Итак, я получаю:

A      B          C         D
32     6100812    778899    SP00001
32     6100812    778593    SP00002
32     6100812    458962    SP00003
33     8000812    885522    SP00004
33     8000812    885537    SP00005
32     6100915    990011    SP00006
32     6100915    789684    SP00007
32     6100915    485217    SP00008

Хотя мне действительно нужно это:

A      B          C         D
32     6100812    778899    SP00001
32     6100812    778593    SP00001
32     6100812    458962    SP00001
33     8000812    885522    SP00002
33     8000812    885537    SP00002
32     6100915    990011    SP00003
32     6100915    789684    SP00003
32     6100915    485217    SP00003

Можно ли это сделать в одном обновлении? Я использую это как встроенный SQL в программе SQLRPGLE.

Заранее спасибо за помощь


person Me_    schedule 10.02.2017    source источник
comment
Можете ли вы использовать отдельную таблицу, содержащую только разные значения столбцов A и B? Поместите свою последовательность # в эту таблицу и присоединитесь к ней.   -  person Andrew    schedule 10.02.2017
comment
Спасибо, это может оказаться полезным, но это увеличит время работы программы, так как мне пришлось бы создать таблицу для нее в библиотеке QTEMP без данных, а затем заполнить ее различными значениями (A, B), обновить последовательность и, наконец, обновить исходную таблицу через соединение. Я пытаюсь найти более прямой подход к поставленной задаче, учитывая, что программа будет часто использоваться.   -  person Me_    schedule 10.02.2017
comment
Связанная таблица кажется лучшей. Теперь у вас будут столбцы ( A, B ) = ( 32, 6100812 ), а следующий ( 33, 8000812 ). Но какая-то неизвестная дата в будущем, в таблицу могут быть вставлены столбцы ( A, B ) = ( 32, 7777777 ). Затем последовательный столбец D будет либо навсегда разбит, либо каждая последующая строка должна будет каким-то образом увеличиваться в зависимости от количества вставленных строк. Изменение архитектуры базы данных в соответствии с реляционными концепциями может избавить от многих проблем в будущем и повысить производительность.   -  person user2338816    schedule 11.02.2017


Ответы (1)


объединиться с MYLIB.MYTABLE ot
с помощью (SELECT A, B, 'SP'||LPAD((ROW_NUMBER() OVER ()),5,'0')
rownum
FROM MYLIB.MYTABLE group по a,b
порядок по a,b

) как nt(a,b,rownum)
на ot.a = nt.a и ot.b=nt.b
при совпадении затем
обновить набор d=nt.rownum
иначе игнорировать

person uSeruSher    schedule 10.02.2017