Database
 sql >> Teknologi Basis Data >  >> RDS >> Database

MERGE:Memperbarui Tabel Sumber dan Target yang Terletak di Server Terpisah

Apakah pernyataan MERGE?

Menggunakan pernyataan MERGE, kita dapat mengubah data dalam tabel target berdasarkan data dalam tabel sumber. Dengan menggunakannya, kita dapat menjalankan INSERT, UPDATE, dan DELETE pada tabel target dalam satu blok kueri. Ini menggabungkan kedua tabel menggunakan kolom, umum di kedua tabel seperti kunci utama. Berdasarkan bagaimana data kolom cocok, perubahan berlaku untuk data tabel target. Gambar berikut mengilustrasikan cara kerja “MERGE”:

Menggunakan MERGE, kita bisa mendapatkan peningkatan kinerja karena ketiga operasi (INSERT, UPDATE, dan DELETE ) dilakukan dalam satu lintasan. Kami tidak perlu menulis pernyataan individual untuk memperbarui perubahan pada tabel target.

Pernyataan gabungan menggunakan SourceTable dan Destinasi. Ini memodifikasi DestinationTable berdasarkan data SourceTable . Kedua tabel dibandingkan menggunakan kondisi, yang didefinisikan dalam Pernyataan Gabung. Kondisi ini menentukan bagaimana SourceTable cocok dengan tabel tujuan. Ini seperti kondisi gabungan yang digunakan untuk mencocokkan baris.

Biasanya, pencocokan harus dilakukan dengan mencocokkan pengidentifikasi unik seperti kunci utama. Misalnya, Tabel Sumber adalah Produk Baru dan tujuannya adalah Productmaster dan kunci utamanya adalah ProductID , maka kondisi penggabungan harus sebagai berikut:

NewProduct.ProductID=ProductMaster.ProdID

Berikut adalah format pernyataan MERGE:

GABUNG target menggunakan sumber saat joinConditionWHEN MATCHEDKemudian updateQueryKETIKA TIDAK COCOK DENGAN TARGETTHEN insertQueryKETIKA TIDAK COCOK DENGAN SUMBER deleteQuery

Untuk memodifikasi data pada tabel target, MERGE mendukung klausa T-SQL berikut.

  1. KAPAN DITEMPATKAN
  2. KETIKA TIDAK SESUAI [MENURUT TARGET]
  3. KETIKA TIDAK COCOK [MENURUT SUMBER]

klausa “KETIKA COCOK”

Klausa ini akan digunakan ketika kita ingin mengupdate atau menghapus record pada tabel tujuan. Di sini catatan dianggap cocok jika data dalam kolom yang digabungkan adalah sama.

klausa “KETIKA TIDAK SESUAI [MENURUT TARGET]”

Jika record ada di tabel sumber tetapi tidak ada di tabel target, maka klausa ini akan digunakan untuk menyisipkan record baru ke tabel target.

klausa “KETIKA TIDAK SESUAI [MENURUT SUMBER]”

Klausa ini akan digunakan ketika kita ingin menghapus atau memperbarui record di tabel sumber yang tidak cocok dengan baris di tabel target.

Gunakan MERGE saat sumber dan target berada di server terpisah

Pada artikel ini, saya akan mendemonstrasikan cara melakukan operasi insert, update, dan delete menggunakan MERGE, ketika tabel sumber dan target berada di server terpisah. Misalnya, perusahaan farmasi menggunakan perangkat lunak inventaris. Basis data master perangkat lunak dan basis data transaksional perangkat lunak berada di server basis data yang terpisah. Berikut ini adalah pengaturannya:

Perusahaan telah menambahkan beberapa produk yang dipesan. Saya ingin melakukan beberapa proses pembersihan sambil memperbarui stok produk. Berikut adalah daftar tugas yang harus dilakukan.

  1. Jika ada produk dalam inventaris dan produk yang sama dipesan, maka perbarui kemudian perbarui stok.
  2. Jika produk tidak ada dalam inventaris dan tambahkan produk yang dipesan, maka tambahkan produk yang ada di stok.
  3. Jika produk ada dalam persediaan tetapi tidak dipesan apalagi stok produk tidak diperbarui selama lebih dari satu tahun daripada menghapus produk dari persediaan.

Untuk melakukan tugas yang disebutkan di atas, kami akan melakukan langkah-langkah berikut:

  1. Buat tabel sementara global bernama ##Source_Trn_Tabl e. Isi data dari “TrnOrder ” (Tabel Sumber) menggunakan OPENROWSET perintahkan dan simpan data di ##Source_Trn_Table .
  2. Lakukan operasi INSERT, UPDATE dan DELETE pada MstStock tabel (Tabel Target) menggunakan MERGE kata kunci, berdasarkan ketentuan berikut:
    • Jika nilai Product_ID kolom ada di ##Source_Trn_Table dan stok tabel, lalu perbarui stok saat ini di MstStock meja.
    • Jika nilai Product_ID kolom ada di ##Source_Trn_Table tetapi tidak ada di MstStock tabel, lalu tambahkan produk ke MstStock meja.
    • Jika nilai Product_ID kolom ada di MstStock tetapi tidak ada di ##Source_Trn_Tabl e, apalagi nilai kolom last_stock_update_date lebih dari satu tahun, lalu hapus product_id dari MstStock meja.

Berikut adalah diagram alirnya:

Demonstrasi

Pertama buat tabel target bernama MstStock dan MstProduct di Product_Master database, terletak di TTI412-VM2 server. Jalankan kueri berikut:

GUNAKAN [Product_Master]GOCREATE TABLE [dbo].[MstProduct]( [ID] [int] IDENTITY(1,1) NOT NULL, [Product_ID] [varchar](15) NULL, [Product_Name] [varchar]( 500) NOT NULL,PRIMARY KEY CLUSTERED ( [ID] ASC)DENGAN (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON)_UNDQUE ASCLUTION] ON [PRIMARY] (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY]GOCREATE TABLE [dbo].[MstStock]( IDENTITY](intStock] 1) NOT NULL, [Product_ID] [varchar](5) NOT NULL, [Current_Stock] [int] NULL, [Last_Stock_Update_Date] [datetime] NULL,PRIMARY KEY CLUSTERED ( [ID] ASC)DENGAN (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE MATI, IGNORE_DUP_KEY =MATI, ALLOW_ROW_LOCKS =AKTIF, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY],UNIQUE NONCLUSTERED ( [Product_ID] ASC)DENGAN (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =LOCKNORE_DOFF, LOCKNORE_DOFF, LOCKNORE_DOFF, LOCK AGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY]GO

Sekarang tambahkan beberapa data ke kedua tabel.

Jalankan kueri berikut untuk menambahkan data ke MstProduct tabel:

SET IDENTITY_INSERT dbo.MstProduct ONGOINSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (28, 'MED141', 'Alfimaxin')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (29, 'MED142', 'MED142', 'Zylasonmuc')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (30, 'MED143', 'Rythmoxabid')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) NILAI (31, 'MED144', 'Omedrozol') INSERT dbo.MstProduct(ID, Product_ID, Product_Name) NILAI (32, 'MED145', 'Reducurzol')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) NILAI (33, 'MED146', 'Losapuritriol')MASERTProduk dbo. (ID, Product_ID, Product_Name) VALUES (34, 'MED147', 'Pipepapren')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (35, 'MED148', 'Miraperahex')INSERT dbo.MstProduct(ID, Product_ID , Product_Name) VALUES (36, 'MED149', 'Durachloridevant')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (37, 'MED151', 'Renachloridenide')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) (38, 'MED152 ', 'Ecopurimuc')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (39, 'MED153', 'Aerocarpambid')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (40, 'MED154', 'Afsitec ')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) NILAI (41, 'MED155', 'Aprozovant')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) NILAI (42, 'MED156', 'Levopafen')INSERT dbo .MstProduct(ID, Product_ID, Product_Name) VALUES (43, 'MED157', 'Medrotraxel')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (44, 'MED158', 'Doxxaliq')INSERT dbo.MstProduct(ID , Product_ID, Product_Name) VALUES (45, 'MED159', 'Betatasine')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (46, 'MED161', 'Ciclopatex')INSERT dbo.MstProduct(ID, Product_ID, Product_ID ) VALUES (47, 'MED162', 'Acadipiphane')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (48, 'MED163', 'Septomapin')INSERT dbo.MstProduct(ID, Product_ID, Product_Name) VALUES (49 , 'MED164', 'Acioxenal')INSERT dbo.MstProduct(ID, Pr oduct_ID, Product_Name) VALUES (50, 'MED165', 'Natadrolol')GOSET IDENTITY_INSERT dbo.MstProduct OFFGO

Jalankan kueri berikut untuk menambahkan data ke MstStock tabel:

masukkan ke nilai MstStock (Product_ID,Current_Stock,Last_Stock_Update_Date) ('MED145',15,'2018-10-14'),('MED146',20,'2018-10-13'),('MED147' ,5,'2018-09-10'),('MED150',5,'2018-08-01'),('MED158',0,'2017-10-14'),('MED159',0 ,'2017-10-14')

Jalankan kueri “Pilih” berikut untuk meninjau output tabel.

Kueri:

Gunakan Product_MasterGoSelect * dari MstProduct

Keluaran:

Kueri:

Gunakan Product_MasterGoSelect * dari MstStock

Keluaran:

Kedua, buat tabel sumber bernama TrnOrder di Inventory_Details database, terletak di TTI412-VM1 server. Jalankan kueri berikut:

GUNAKAN [Inventory_Details]GOCREATE TABLE [dbo].[TrnOrder]( [ID] [int] IDENTITY(1,1) NOT NULL, [Product_ID] [varchar](15) NOT NULL, [Ordered_Qty] [int] NULL, [Tanggal_Pesanan] [waktu_tanggal] NULL, [Tanggal_Pemesanan_Terakhir] [waktu_tanggal] NULL,KUNCI UTAMA TERKELUP ( [ID] ASC)DENGAN (PAD_INDEX =MATI, STATISTICS_NORECOMPUTE =MATI, IGNORE_DUP_KEY =OFF_PAGE_LOCK) =OFF_PAGE_LOCKS =OFF_PAGE_LOCKS [PRIMARY],UNIQUE NONCLUSTERED ( [Product_ID] ASC)DENGAN (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY] ON [PRIMARY] ON [PRIMARY] 

Jalankan kueri berikut untuk menambahkan data ke MstStock tabel:

masukkan ke dalam nilai TrnOrder (ID_Produk,Jumlah_Pesanan,Tanggal_Pesanan,Tanggal_Pesanan_Terakhir)nilai ('MED145',10,convert(date,getdate()),'2018-10-14'),('MED146',5,convert( tanggal,getdate()),'2018-10-13'),('MED147',15,convert(date,getdate()),'2018-09-10'),('MED150',200,convert( tanggal,getdate()),'2018-08-01') ,('MED169',50,convert(date,getdate()),'2018-10-14'),('MED170',100,convert( tanggal,getdate()),'2018-10-14')

Jalankan kueri “Pilih” berikut untuk meninjau output tabel.

Kueri:

Gunakan Inventory_DetailsGoSelect * dari TrnOrder

Keluaran:

Hubungkan ke instance SQL Server Jarak Jauh untuk mengisi data

Seperti yang saya sebutkan, kami ingin memperbarui nilai di “tabel yang dibuat di server jauh. Kita dapat mengakses data dari server database jarak jauh dengan menggunakan metode berikut.

  1. Server Tertaut SQL Server :Server tertaut digunakan untuk menjalankan perintah pada sumber data OLEDB yang ditautkan ke instance SQL Server jarak jauh. Menggunakan server tertaut, Anda juga dapat menanyakan produk database yang berbeda seperti Oracle. Sumber OLEDB dapat dikonfigurasi untuk mengakses Microsoft Access dan Excel sebagai server tertaut.
  2. Fungsi SQL Server OPENROWSET :Menggunakan fungsi OPENROWSET, kita dapat menjalankan kueri Ad-Hoc pada sumber data OLEDB jarak jauh.

Dalam artikel ini, kita akan menggunakan OPENROWSET metode untuk mengakses data tabel jarak jauh. Untuk mengkueri server jauh menggunakan fungsi OPENROWSET, kita harus mengaktifkan Kueri Terdistribusi Ad hoc parameter konfigurasi.

“Kueri Terdistribusi Ad hoc” adalah opsi lanjutan, oleh karena itu pertama-tama kita harus mengaktifkan Tampilkan opsi Lanjutan parameter konfigurasi. Untuk melakukannya, jalankan perintah berikut di jendela Query studio manajemen SQL Server.

exec sp_configure 'tampilkan opsi lanjutan',1konfigurasi ulang dengan overrideGo

Setelah Tampilkan opsi lanjutan parameter diaktifkan, jalankan kueri berikut untuk mengaktifkan Kueri Terdistribusi Ad hoc :

sp_configure 'Kueri Terdistribusi Ad Hoc', 1;KONFIGURASI ULANG DENGAN OVERRIDE;GO

Kami tidak dapat menggunakan fungsi “OPENROWSET” untuk melakukan operasi MERGE menggunakan data dari server jauh. Untuk melakukan itu pertama kita harus mengimpor data dari server jauh dan menyimpannya di tabel sementara global. Setelah itu, kita dapat menggunakan data yang ada di dalam tabel sementara global untuk memperbarui tabel target.

Seperti yang saya sebutkan, pertama-tama kita harus mengimpor data dari tabel jarak jauh. Untuk melakukannya, buat tabel temp dan impor data menggunakan fungsi OPENROWSET.
Kueri berikut akan membuat tabel sementara global.

gunakan Product_MastergoCREATE TABLE ##Source_Trn_Order( [ID] [int] IDENTITY(1,1) NOT NULL, [Product_ID] [varchar](15) NOT NULL, [Ordered_Qty] [int] NULL, [Ordered_Date] [datetime ] NULL, [Tanggal_Pesanan_Terakhir] [waktu tanggal] NULL)

Setelah tabel temp dibuat, mari memuat data dari tabel sumber yang terletak di server jauh. Untuk melakukannya, jalankan kueri berikut:

masukkan ke ##Source_Trn_Order pilih [Product_ID],[Ordered_Qty],[Ordered_Date],[Last_Ordered_Date] dari OPENROWSET('SQLNCLI', 'Server=TTI609-VM1;Trusted_Connection=yes;','SELECT_Produk_ID, Tanggal_Pesanan,Tanggal_Pesanan_Terakhir DARI Inventory_Details.dbo.TrnOrder') SEBAGAI;

Langkah 1:Jika produk ada di MstStock (Tabel Target) dan TrnOrder (Tabel Sumber), maka perbarui kuantitas saat ini di MstStock

Untuk melakukannya, gunakan KETIKA MATCHED ayat. Klausa bergabung dengan tabel Sumber dan Target pada kolom umum dari kedua tabel. ID_Produk kolom umum di antara MstStock dan ##Source_Trn_Table, maka gunakan untuk menggabungkan kedua tabel.

Jalankan kode berikut:

 MERGE MstStock target_StockUSING ##Source_Trn_Order Source_OrderON target_Stock.Product_Id =Source_Order.Product_Id KETIKA COCOK LALU UPDATE SET target_Stock.Current_Stock =Source_Order.Ordered_Qty + target_Stock_Stock. 

Nilai kolom Current_Stock dari 4 produk harus diperbarui. Jalankan kueri berikut untuk memverifikasi output:

pilih b.Product_ID,b.Product_Name,a.Current_Stock,a.Last_Stock_Update_Date dari MstStock, gabung dalam MstProduct b pada a.Product_ID=b.Product_ID dan a.Current_Stock>0

Berikut adalah outputnya:

Langkah 2:Jika Produk tidak ada di MstStock (Tabel Target), tambahkan di MstStock (Tabel Target)

Toko farmasi telah memesan beberapa produk. Produk tersebut ditambahkan di tabel MstProduct tetapi tidak ditambahkan ke tabel MstStock. Untuk menambahkan produk tersebut di MstStock tabel, saya akan menggunakan klausa WHEN NOT MATCHED [TARGET]. Klausa menggabungkan tabel sumber dan target menggunakan kolom umum. Jika baris yang cocok tidak ditemukan di tabel target, maka baris tersebut akan disisipkan dari tabel sumber.

Untuk menambahkan produk ke MstStock menggunakan GABUNG tabel, jalankan kode berikut:

MERGE mststock target_Stockusing ##source_trn_order Source_OrderON target_Stock.product_id =source_order.product_idWHEN cocok MAKA UPDATE SET target_Stock.current_stock =Source_Order.ordered_qty + target_Stock.current_stock, last_stock_update_date =Getdate()_stock_N target last_stock_update_date) NILAI (Source_Order.product_id, Source_Order.ordered_qty, Getdate());

Dua ID produk, MED169 dan MED170, harus ditambahkan. Jalankan kueri berikut untuk meninjau keluaran:

pilih b.Product_ID,b.Product_Name,a.Current_Stock,a.Last_Stock_Update_Date dari MstStock, gabung dalam MstProduct b pada a.Product_ID=b.Product_ID dan a.Current_Stock>0

Berikut adalah outputnya:

Langkah 3:Hapus Item dari MstStock (Tabel Target), jika stok saat ini di MstStock (Tabel Target) adalah nol dan produk tidak ada di ##Source_Trn_Order (tabel sumber)

Di inventory, ada beberapa produk yang perlu dihapus karena sudah setahun tidak dipesan. Oleh karena itu, kita harus menghapusnya dari MstStock tabel dan tabel MstProducts. Untuk menghapus produk tersebut dari MstStock tabel, kita dapat menggunakan KETIKA TIDAK COCOK [SUMBER] .

KETIKA TIDAK COCOK [SUMBER] klausa menggabungkan tabel sumber dan target menggunakan kolom umum. Jika baris yang cocok tidak ditemukan di tabel sumber, maka baris tersebut akan dihapus dari tabel target.

Untuk menghapus produk dari MstStock tabel, jalankan kode berikut:

MERGE mststock target_Stockusing ##source_trn_order Source_OrderON target_Stock.product_id =source_order.product_idWHEN cocok MAKA UPDATE SET target_Stock.current_stock =Source_Order.ordered_qty + target_Stock.current_stock, last_stock_update_date =Getdate()_stock_N target last_stock_update_date) NILAI (Source_Order.product_id, Source_Order.ordered_qty, Getdate()) KETIKA TIDAK cocok DENGAN SUMBER LALU HAPUS;

Dua ID produk, MED158 dan MED159 harus ditambahkan. Jalankan kueri berikut untuk meninjau keluaran:

pilih b.Product_ID,b.Product_Name,a.Current_Stock,a.Last_Stock_Update_Date dari MstStock, gabung dalam MstProduct b pada a.Product_ID=b.Product_ID dan a.Current_Stock>0

Berikut adalah outputnya:

Ringkasan

Dalam artikel ini saya telah membahas sebagai berikut:

  1. Apa itu kata kunci MERGE dan bagaimana cara kerjanya?
  2. Klausa berbeda yang digunakan dalam MERGE untuk memperbarui tabel sumber dan target.
  3. Cara memodifikasi data menggunakan kata kunci MERGE ketika database berada di server yang berbeda.

Alat yang berguna:

dbForge Data Compare for SQL Server – alat perbandingan SQL canggih yang mampu bekerja dengan data besar.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Menggunakan ODBC dengan Salesforce dan Layanan Federasi Direktori Aktif (ADFS) Sistem Masuk Tunggal (SSO)

  2. PEMBARUAN untuk Statistik

  3. Migrasi Database SQL dengan Baris Perintah

  4. Bekerja dengan Salesforce.com di Alpha Anywhere

  5. Menghitung Median dengan Kursor Dinamis