Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Pernyataan pembaruan Oracle dengan fungsi grup

Anda memiliki dua catatan di setiap tabel di mana area adalah 01 , dan Anda perlu menyetelnya ke nilai yang berbeda untuk memenuhi kunci utama - Anda tidak dapat menyetel keduanya ke nilai maks atau min dari tabel kedua, jadi Anda tidak benar-benar ingin melakukan pengelompokan apa pun.

Sepertinya tidak ada urutan lain antara catatan dengan area yang sama , jadi saya akan menganggap itu sewenang-wenang dan tidak masalah catatan mana untuk setiap area mendapatkan branch_code . mana dari meja lainnya. Jika tidak sewenang-wenang maka aturan perlu ditentukan...

Pembaruan yang berkorelasi rumit jika Anda perlu mencocokkan pada urutan arbitrer dalam sekelompok catatan. Anda memerlukan beberapa cara untuk mengidentifikasi urutan baris, tetapi menambahkan row_number() kolom ke tabel asli untuk membuat tampilan sebaris akan menyebabkan kesalahan ORA-01732.

Namun, Anda dapat menggunakan rowid table tabel target kolom semu; Anda hanya perlu melakukan penggabungan tambahan dalam korelasi untuk mendapatkan nilai yang sama bersama dengan branch_code baru . Sesuatu seperti:

select bc.rid,
  bc.area,
  bc.branch_code,
  bc.branch_name,
  bc2.area,
  bc2.branch_code,
  bc2.branch_name
from (
  select bc.*,
    bc.rowid as rid,
    row_number() over (partition by bc.area order by bc.branch_code) as rn
  from branch_cp bc
) bc
join (
  select bc2.*,
    row_number() over (partition by bc2.area order by bc2.branch_code) as rn
  from branch_cp_2 bc2
) bc2
on bc2.area = bc.area
and bc2.rn = bc.rn;

Yang memberi Anda:

RID                AREA  BRANCH_CODE BRANCH_NAME AREA  BRANCH_CODE BRANCH_NAME
------------------ ----- ----------- ----------- ----- ----------- -----------
AAAwy+AAEAAAA0DAAA 01    01          A           01    04          D           
AAAwy+AAEAAAA0DAAB 01    02          B           01    05          E           
AAAwy+AAEAAAA0DAAC 03    03          C           03    06          F           

Sekarang Anda tidak benar-benar membutuhkan semua kolom itu, Anda hanya perlu rid (branch_cp.rowid ) dan branch_cp_2.branch_code yang berkorelasi .

Tetapi Anda juga hanya ingin memperbarui ketika ada kecocokan - untuk membatalkan nulling setiap baris di mana tidak ada nilai di tabel lain - jadi Anda harus mengulangi penggabungan itu di exists subkueri.

Lebih mudah melakukan merge :

merge into branch_cp bc
using (
  select bc.rid,
      bc2.branch_code
    from (
      select bc.*,
        bc.rowid as rid,
        row_number() over (partition by bc.area order by bc.branch_code) as rn
      from branch_cp bc
    ) bc
    join (
      select bc2.*,
        row_number() over (partition by bc2.area order by bc2.branch_code) as rn
      from branch_cp_2 bc2
    ) bc2
    on bc2.area = bc.area
    and bc2.rn = bc.rn
) bc2
on (bc.rowid = bc2.rid)
when matched then update set bc.branch_code = bc2.branch_code;

3 rows merged.

Meja Anda sekarang memiliki:

select * from branch_cp;

AREA  BRANCH_CODE BRANCH_NAME
----- ----------- -----------
01    04          A           
01    05          B           
03    06          C           

SQL Fiddle .




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ekstrak tanggal dari string oracle

  2. Memparalelkan panggilan dalam PL/SQL

  3. Cara Menambahkan Batas Vertikal ke Kotak Keluaran SQL*Plus / SQLcl Anda

  4. PLS-00221:'C1'(kursor) bukan prosedur atau tidak terdefinisi

  5. pencarian teks oracle blob