Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Consulta de atualização múltipla do Oracle


O seguinte pressupõe que um ITEM_CODE seja atribuído a apenas um DEPARTMENT_CODE, porque é simples e você não nos forneceu outras regras de negócios. Se essa suposição estiver errada, você precisará ajustar a lógica de acordo.

Também incorporei sua exigência de que o valor existente de COMPETITOT.COMPETITOR_CODE não é confiável.

Dada esta data de teste:
SQL> select * from competitor
  2  /

STORE_CODE  ITEM_CODE DEPARTMENT_CODE COMPETITOR
---------- ---------- --------------- ----------
        11     912003              14 01
        11     912003              14 04
        11     912003              14 03
        11     912004              14 01
        11     912004              14 02
        11     912004              14 04
        11     914001              14 01
        11     914001              14 02
        11     914001              14 05

9 rows selected.

SQL>

Podemos usar um ROW_NUMBER() analítico para gerar o handle necessário para COMPETITOR_CODE:
SQL> update competitor c
  2  set competitor_code =
  3          (select decode (dr
  4                         , 1, 'Comp_1'
  5                         , 2, 'Comp_2'
  6                         , 3, 'Comp_3')
  7             from ( select row_number() over ( partition by x.item_code
  8                                                  order by x.rowid ) as dr
  9                           , x.rowid as row_id
 10                    from competitor x
 11                    where x.item_code in ( select item_code
 12                                           from item
 13                                           where  department_code = 14 ) ) l
 14             where c.rowid = l.rowid )
 15  /

9 rows updated.

SQL>

E este é o resultado desejado (exceto quaisquer adições adicionais às regras de negócios):
SQL> select * from competitor
  2  /

STORE_CODE  ITEM_CODE DEPARTMENT_CODE COMPETITOR
---------- ---------- --------------- ----------
        11     912003              14 Comp_1
        11     912003              14 Comp_2
        11     912003              14 Comp_3
        11     912004              14 Comp_1
        11     912004              14 Comp_2
        11     912004              14 Comp_3
        11     914001              14 Comp_1
        11     914001              14 Comp_2
        11     914001              14 Comp_3

9 rows selected.

SQL>