DELETE/INSERT/UPDATE bersyarat di MERGE

Saya menemukan dua contoh tentang MERGE dengan DML bersyarat

Contoh pertama,

MERGE INTO bonuses D
   USING (SELECT employee_id, salary, department_id FROM employees
   WHERE department_id = 80) S
   ON (D.employee_id = S.employee_id)
   WHEN MATCHED THEN UPDATE SET D.bonus = D.bonus + S.salary*.01
     DELETE WHERE (S.salary > 8000)
   WHEN NOT MATCHED THEN INSERT (D.employee_id, D.bonus)
     VALUES (S.employee_id, S.salary*.01)
     WHERE (S.salary <= 8000);

Saya cenderung memahami bahwa di MERGE, hanya tabel target (D di sini) yang diubah. Ketika kita meletakkan DML di WHEN, itu akan bertindak pada tabel target D. Jadi dalam hal ini apa hubungannya kondisi dengan S, seperti pada klausa DELETE dan UPDATE. Kapan WHERE mulai beraksi? Setelah pencocokan? Pada sumber/target sebelum ON ?

Contoh terkait lainnya dengan satu pertanyaan lagi

MERGE INTO destination d
  USING source s
    ON (s.id = d.id)
  WHEN MATCHED THEN
    UPDATE SET  d.description = 'Updated',
                d.status = 10
    DELETE WHERE s.status = 10;

Dan

MERGE INTO destination d
  USING source s
    ON (s.id = d.id)
  WHEN MATCHED THEN
    UPDATE SET  d.description = 'Updated',
                d.status = 10
    DELETE WHERE d.status = 10;

Saya tidak mengerti perbedaan antara 2 skenario: tabel sumber versus tabel target di klausa WHERE.

Terima kasih sebelumnya.


person Kenny    schedule 22.04.2016    source sumber


Jawaban (2)


Ada dua bagian dalam operasi MERGE: Tindakan APA yang harus diambil (semacam pembaruan, termasuk penyisipan dan penghapusan) - ini selalu HANYA pada tabel target; dan KAPAN mengambil tindakan - kondisi apa yang harus dipenuhi untuk memulai pembaruan. Kondisi tersebut harus mengacu pada sesuatu di tabel target, tetapi juga merujuk pada tabel sumber.

Dalam contoh pertama Anda: tabel target hanya memiliki id dan bounse karyawan. Anda ingin meningkatkan setiap bonus sebesar 1% dari gaji pokok, untuk setiap karyawan - dan menambahkan bounus (bila tidak ada baris untuk karyawan tersebut) untuk karyawan yang tidak diberi bonus sama sekali. Jadi tidak bisa hanya melihat tabel target saja, harus juga melihat di tempat lain, dimana gaji disimpan. Dalam hal ini, "KETIKA COCOK" memastikan Anda melihat id karyawan yang sama di kedua tabel. Kemudian Anda meningkatkan bonus sebesar 1% dari gaji pokok; gaji pokok dibaca dari tabel sumber. Kemudian Anda menghapus bonus sama sekali (tidak akan ada baris untuk id karyawan di tabel BONUS) jika karyawan tersebut memiliki gaji pokok lebih besar dari 80.000 - itu harus menjadi keputusan bisnis yang tercermin dalam database. Jadi Anda tahu bagaimana Anda perlu merujuk data di tempat selain tabel target, meskipun perubahan itu sendiri hanya memengaruhi target.

Pada contoh kedua, efeknya akan sama.

person mathguy    schedule 22.04.2016

Pada contoh pertama, 1. Karyawan yang termasuk dalam departemen 80 diidentifikasi. Karyawan ini mungkin memiliki atau tidak memiliki catatan bonus terhadap ID karyawan mereka di tabel bonus. 2. Apabila bonus sudah ada dalam bonus, kenaikan bonus dalam bonus untuk karyawan tersebut sebesar 1 persen dari gajinya. Setelah itu, jika gaji karyawan lebih dari 8000 ia tidak boleh mendapat bonus, maka hapus catatan bonusnya dari bonus. 3. jika belum ada bonus dan jika gaji karyawan tidak lebih dari 8000 tambahkan catatan bonus baru.

Urutan dalam hal ini untuk tujuan pemahaman adalah ON, KETIKA COCOK, LALU UPDATE, WHERE, DELETE, KETIKA TIDAK COCOK, WHERE, INSERT

Pada contoh kedua, kueri 1: Jika rekaman sumber ada di tujuan, a. perbarui deskripsi dan status tujuan. B. Kemudian jika status sumbernya 10, maka hapus record dengan id yang sama dari tujuan.

kueri 2: Jika rekaman sumber ada di tujuan, a. perbarui deskripsi dan status tujuan. B. Kemudian hapus catatan itu dari tujuan.

Dalam query2, pembaruan berlebihan kecuali ada pemicu yang memperbarui tabel lain.

Urutan dalam hal ini untuk tujuan pemahaman adalah ON, KETIKA COCOK, LALU UPDATE, WHERE, DELETE

Semoga ini membantu.

person ArtBajji    schedule 22.04.2016