Oracle
 sql >> Baza danych >  >> RDS >> Oracle

Zapytanie o wielokrotną aktualizację Oracle

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>



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Wyklucz pozycje zgodnie z zapisem

  2. Jak mogę zdefiniować typ w oracle11g, który odwołuje się do kolekcji tego typu?

  3. Agreguj wiersze w instrukcji Oracle SQL

  4. Funkcja JSON_ARRAY() w Oracle

  5. Jak uzyskać najnowszy rekord pracownika w Oracle?