Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Oracle Mehrfachaktualisierungsabfrage

Im Folgenden wird davon ausgegangen, dass ein ITEM_CODE nur einem DEPARTMENT_CODE zugeordnet ist, weil es einfach ist und Sie uns keine weiteren Geschäftsregeln gegeben haben. Wenn diese Annahme falsch ist, müssen Sie die Logik entsprechend anpassen.

Ich habe auch Ihre Anforderung berücksichtigt, dass der vorhandene Wert von COMPETITOT.COMPETITOR_CODE unzuverlässig ist.

Angesichts dieses Testdatums:

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>

Wir können eine analytische ROW_NUMBER() verwenden, um das notwendige Handle für COMPETITOR_CODE zu generieren:

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>

Und dies ist das gewünschte Ergebnis (vorbehaltlich weiterer Ergänzungen der Geschäftsregeln):

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>