Oracle
 sql >> база данни >  >> RDS >> Oracle

Заявка за множество актуализации на Oracle

Следното предполага, че ITEM_CODE е присвоен само на един DEPARTMENT_CODE, тъй като е прост и не сте ни дали допълнителни бизнес правила. Ако това предположение е грешно, ще трябва да коригирате логиката съответно.

Също така включих вашето изискване, че съществуващата стойност на COMPETITOT.COMPETITOR_CODE е ненадеждна.

Предвид тази дата на теста:

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>

Можем да използваме аналитичен ROW_NUMBER(), за да генерираме необходимия манипулатор за 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>

И това е желаният резултат (с изключение на допълнителни допълнения към бизнес правилата):

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. Преобразувайте дроб в десетичен знак

  2. Автоматизиран инструмент за миграция на схеми на Oracle

  3. последователността не съществува ORA-02289

  4. атомно сравняване и размяна в база данни

  5. Oracle счита празните низове за NULL, докато SQL Server не го прави - как се справя най-добре с това?