Poniżej założono, że ITEM_CODE jest przypisany tylko do jednego DEPARTMENT_CODE, ponieważ jest to proste i nie dałeś nam żadnych dalszych reguł biznesowych. Jeśli to założenie jest błędne, będziesz musiał odpowiednio dostosować logikę.
Uwzględniłem również Twoje wymaganie, że istniejąca wartość COMPETITOT.COMPETITOR_CODE jest niewiarygodna.
Biorąc pod uwagę tę datę testu:
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>
Możemy użyć analitycznego ROW_NUMBER() do wygenerowania niezbędnego uchwytu dla 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>
I to jest pożądany wynik (z wyjątkiem jakichkolwiek dalszych dodatków do reguł biznesowych):
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>