Database
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Database

MERGE:Cập nhật các bảng nguồn và mục tiêu nằm trên các máy chủ riêng biệt

Câu lệnh MERGE là gì?

Sử dụng câu lệnh MERGE, chúng ta có thể thay đổi dữ liệu trong bảng đích dựa trên dữ liệu trong bảng nguồn. Sử dụng nó, chúng ta có thể thực thi CHÈN, CẬP NHẬT và XÓA trên các bảng đích trong một khối truy vấn duy nhất. Nó kết hợp cả hai bảng bằng cách sử dụng các cột, phổ biến trong cả hai bảng như khóa chính. Dựa trên cách dữ liệu cột đối sánh, các thay đổi sẽ áp dụng cho dữ liệu của bảng mục tiêu. Hình ảnh sau minh họa cách “MERGE” hoạt động:

Sử dụng MERGE, chúng tôi có thể cải thiện hiệu suất vì cả ba thao tác (CHÈN, CẬP NHẬT và XÓA ) được thực hiện trong một lần vượt qua. Chúng tôi không cần phải viết một câu lệnh riêng lẻ để cập nhật các thay đổi trong bảng mục tiêu.

Câu lệnh hợp nhất sử dụng SourceTable và Destinationtable. Nó sửa đổi DestinationTable dựa trên dữ liệu của SourceTable . Cả hai bảng được so sánh bằng cách sử dụng điều kiện, được xác định trong Tuyên bố Hợp nhất. Điều kiện này xác định cách SourceTable khớp với bảng đích. Nó giống như các điều kiện kết hợp được sử dụng để khớp các hàng.

Thông thường, việc đối sánh phải được thực hiện bằng cách đối sánh các số nhận dạng duy nhất như khóa chính. Ví dụ:Bảng nguồn là Sản phẩm mới và đích là Productmaster và khóa chính là ProductID , thì điều kiện hợp nhất phải như sau:

 NewProduct.ProductID =ProductMaster.ProdID 

Sau đây là định dạng của câu lệnh MERGE:

 MERGE đích sử dụng nguồn sON joinConditionWEN MATCHEDTHEN updateQueryWHEN KHÔNG ĐƯỢC PHÉP THEO MỤC TIÊU 

Để sửa đổi dữ liệu trên bảng đích, MERGE hỗ trợ các mệnh đề T-SQL sau.

  1. KHI ĐÃ ĐƯỢC KẾT HỢP
  2. KHI CHƯA ĐƯỢC TRAO ĐỔI [THEO MỤC TIÊU]
  3. KHI CHƯA ĐƯỢC TRAO ĐỔI [THEO NGUỒN]

Mệnh đề "KHI ĐƯỢC PHÙ HỢP"

Mệnh đề này sẽ được sử dụng khi chúng ta muốn cập nhật hoặc xóa các bản ghi trên bảng đích. Ở đây, các bản ghi được coi là khớp khi dữ liệu trong các cột được kết hợp giống nhau.

mệnh đề “KHI KHÔNG ĐƯỢC PHÙ HỢP [THEO MỤC TIÊU]”

Nếu bản ghi có trong bảng nguồn nhưng không có trong bảng đích thì mệnh đề này sẽ được sử dụng để chèn bản ghi mới vào bảng đích.

mệnh đề “KHI KHÔNG ĐƯỢC PHÙ HỢP [THEO NGUỒN]”

Mệnh đề này sẽ được sử dụng khi chúng ta muốn xóa hoặc cập nhật một bản ghi trong bảng nguồn không khớp với một hàng trong bảng đích.

Sử dụng MERGE khi nguồn và đích nằm trên một máy chủ riêng biệt

Trong bài viết này, tôi sẽ trình bày cách thực hiện thao tác chèn, cập nhật và xóa bằng MERGE, khi bảng nguồn và bảng đích nằm trong các máy chủ riêng biệt. Ví dụ, một công ty dược phẩm sử dụng phần mềm kiểm kê. Cơ sở dữ liệu tổng thể của một phần mềm và cơ sở dữ liệu giao dịch của phần mềm nằm trên các máy chủ cơ sở dữ liệu riêng biệt. Sau đây là cách thiết lập:

Công ty đã thêm một vài sản phẩm đã đặt hàng. Tôi muốn thực hiện một số quy trình dọn dẹp trong khi cập nhật kho sản phẩm. Sau đây là danh sách các nhiệm vụ phải được thực hiện.

  1. Nếu một sản phẩm tồn tại trong kho và cùng một sản phẩm đã được đặt hàng, hãy cập nhật rồi cập nhật kho.
  2. Nếu một sản phẩm không tồn tại trong kho và thêm sản phẩm được đặt hàng hơn là thêm sản phẩm trong kho.
  3. Nếu sản phẩm tồn tại trong kho nhưng sản phẩm không được đặt hàng hơn nữa, sản phẩm không được cập nhật trong hơn một năm thì bạn nên xóa sản phẩm khỏi kho.

Để thực hiện nhiệm vụ nêu trên, chúng ta sẽ thực hiện các bước sau:

  1. Tạo một bảng tạm thời chung có tên ## Source_Trn_Tabl e. Điền dữ liệu từ “ TrnOrder ”(Bảng Nguồn) bằng cách sử dụng OPENROWSET lệnh và lưu trữ dữ liệu trong ## Source_Trn_Table .
  2. Thực hiện thao tác CHÈN, CẬP NHẬT và XÓA trên MstStock bảng (Bảng mục tiêu) bằng cách sử dụng MERGE từ khóa, dựa trên các điều kiện sau:
    • Nếu giá trị của Product_ID cột tồn tại trong ## Source_Trn_Table cổ phiếu , sau đó cập nhật kho hiện tại trong MstStock bảng.
    • Nếu giá trị của Product_ID cột tồn tại trong ## Source_Trn_Table nhưng không tồn tại trong MstStock , sau đó thêm sản phẩm vào MstStock bảng.
    • Nếu giá trị của Product_ID cột tồn tại trong MstStock nhưng không tồn tại trong ## Source_Trn_Tabl e, hơn nữa là giá trị cột của last_stock_update_date lớn hơn một năm, sau đó xóa product_id từ MstStock bảng.

Sau đây là lưu đồ:

Trình diễn

Đầu tiên, hãy tạo một bảng mục tiêu có tên MstStock MstProduct trên Product_Master cơ sở dữ liệu, nằm trên TTI412-VM2 máy chủ. Thực hiện truy vấn sau:

 SỬ DỤNG [Product_Master] GOCREATE TABLE [dbo]. [MstProduct] ([ID] [int] IDENTITY (1,1) NOT NULL, [Product_ID] [varchar] (15) NULL, [Product_Name] [varchar] ( 500) KHÔNG ĐẦY ĐỦ, KHÓA CHÍNH XÁC ĐƯỢC ([ID] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY], UNIQUE NONCLUSTERED [Product_IDERED] (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] ([ID] [int, IDENTITY (1) 1) NOT NULL, [Product_ID] [varchar] (5) NOT NULL, [Current_Stock] [int] NULL, [Last_Stock_Update_Date] [datetime] NULL, PRIMARY KEY CLUSTERED ([ID] ASC) WITH (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY], DUY NHẤT KHÔNG CHỈNH SỬA ([Product_ID] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALL, ALL, IGNORE_DUP_KEY =OFF, ALL, ALL AGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] GO 

Bây giờ, hãy thêm một số dữ liệu vào cả hai bảng.

Thực thi truy vấn sau để thêm dữ liệu vào MstProduct bảng:

 SET IDENTITY_INSERT dbo.MstProduct ONGOINSERT dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (28, 'MED141', 'Alfimaxin') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (29, 'MED142', 'Zylasonmuc') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (30, 'MED143', 'Rythmoxabid') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (31, 'MED144', 'Omedrozol') INSERT dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (32, 'MED145', 'Reducurzol') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (33, 'MED146', 'Losapuritriol') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (34, 'MED147', 'Pipepapren') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (35, 'MED148', 'Miraperahex') CHÈN dbo.MstProduct (ID, Product_ID , Product_Name) VALUES (36, 'MED149', 'Durachloridevant') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (37, 'MED151', 'Renachloridenide') INSERT dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (38, 'MED152 ',' Ecopurimuc ') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (39,' MED153 ',' Aerocarpambid ') INSERT dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (40,' MED154 ',' Afsitec ') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (41,' MED155 ',' Aprozovant ') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (42,' MED156 ',' Levopafen ') CHÈN dbo .MstProduct (ID, Product_ID, Product_Name) VALUES (43, 'MED157', 'Medrotraxel') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (44, 'MED158', 'Doxxaliq') CHÈN dbo.MstProduct (ID , Product_ID, Product_Name) VALUES (45, 'MED159', 'Betatasine') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name) VALUES (46, 'MED161', 'Ciclopatex') CHÈN dbo.MstProduct (ID, Product_ID, Product_Name ) 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') CHÈN dbo.MstProduct (ID, Pr oduct_ID, Product_Name) VALUES (50, 'MED165', 'Natadrolol') GOSET IDENTITY_INSERT dbo.MstProduct OFFGO 

Thực thi truy vấn sau để thêm dữ liệu vào MstStock bảng:

 chèn vào các giá trị 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 , 'Ngày 10 tháng 10 năm 2017') 

Thực hiện các truy vấn “Chọn” sau để xem lại kết quả đầu ra của các bảng.

Truy vấn:

 Sử dụng Product_MasterGoSelect * từ MstProduct 

Đầu ra:

Truy vấn:

 Sử dụng Product_MasterGoSelect * từ MstStock 

Đầu ra:

Thứ hai, tạo bảng nguồn có tên TrnOrder trên Inventory_Details cơ sở dữ liệu, nằm trên TTI412-VM1 máy chủ. Thực hiện truy vấn sau:

 SỬ DỤNG [Inventory_Details] GOCREATE TABLE [dbo]. [TrnOrder] ([ID] [int] IDENTITY (1,1) NOT NULL, [Product_ID] [varchar] (15) NOT NULL, [Ordered_Qty] [int] NULL, [Ordered_Date] [datetime] NULL, [Last_Ordered_Date] [datetime] NULL, PRIMARY KEY CLUSTERED ([ID] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON_LOCKS_PAGE =ON, ALLOW [PRIMARY], DUY NHẤT KHÔNG CHỈNH SỬA ([Product_ID] ASC) VỚI (PAD_INDEX =OFF, STATISTICS_NORECOMPUTE =OFF, IGNORE_DUP_KEY =OFF, ALLOW_ROW_LOCKS =ON, ALLOW_PAGE_LOCKS =ON) ON [PRIMARY]) ON [PRIMARY] 

Thực thi truy vấn sau để thêm dữ liệu vào MstStock bảng:

 chèn vào các giá trị TrnOrder (Product_ID, Order_Qty, Ordered_Date, Last_Ordered_Date) ('MED145', 10, convert (date, getdate ()), '2018-10-14'), ('MED146', 5, convert ( date, getdate ()), '2018-10-13'), ('MED147', 15, convert (date, getdate ()), '2018-09-10'), ('MED150', 200, convert ( date, getdate ()), '2018-08-01'), ('MED169', 50, convert (date, getdate ()), '2018-10-14'), ('MED170', 100, convert ( date, getdate ()), '2018-10-14') 

Thực hiện truy vấn “Chọn” sau để xem lại kết quả đầu ra của bảng.

Truy vấn:

 Sử dụng Inventory_DetailsGoSelect * từ TrnOrder 

Đầu ra:

Kết nối với phiên bản Máy chủ SQL Từ xa để điền dữ liệu

Như tôi đã đề cập, chúng tôi muốn cập nhật các giá trị trong “bảng được tạo trên máy chủ từ xa. Chúng tôi có thể truy cập dữ liệu từ máy chủ cơ sở dữ liệu từ xa bằng cách sử dụng các phương pháp sau.

  1. Máy chủ được liên kết của SQL Server :Máy chủ được liên kết được sử dụng để thực thi một lệnh trên nguồn dữ liệu OLEDB được liên kết với phiên bản SQL Server từ xa. Sử dụng một máy chủ được liên kết, bạn cũng có thể truy vấn sản phẩm cơ sở dữ liệu khác nhau như Oracle. Nguồn OLEDB có thể được định cấu hình để truy cập Microsoft Access và Excel dưới dạng máy chủ được liên kết.
  2. Hàm OPENROWSET của SQL Server :Bằng cách sử dụng chức năng OPENROWSET, chúng tôi có thể thực hiện truy vấn Ad-Hoc trên nguồn dữ liệu OLEDB từ xa.

Trong bài viết này, chúng tôi sẽ sử dụng OPENROWSET phương pháp truy cập dữ liệu của bảng từ xa. Để truy vấn máy chủ từ xa bằng chức năng OPENROWSET, chúng tôi phải bật Truy vấn phân tán đặc biệt tham số cấu hình.

“Truy vấn phân tán đặc biệt” là một tùy chọn nâng cao, do đó, trước tiên chúng ta phải bật tùy chọn Hiển thị tùy chọn nâng cao tham số cấu hình. Để làm điều đó, hãy thực thi lệnh sau trong cửa sổ Truy vấn của studio quản lý SQL Server.

 execute sp_configure 'hiển thị các tùy chọn nâng cao', 1 định cấu hình bằng overrideGo 

Sau khi Hiển thị tùy chọn nâng cao tham số được bật, hãy thực thi truy vấn sau để bật Truy vấn phân tán đặc biệt :

 sp_configure 'Các truy vấn được phân phối trong Ad Hoc', 1; CẤU HÌNH LẠI VỚI BÊN NGOÀI; ĐI 

Chúng tôi không thể sử dụng chức năng “OPENROWSET” để thực hiện thao tác MERGE bằng cách sử dụng dữ liệu của máy chủ từ xa. Để làm điều đó, đầu tiên chúng ta phải nhập dữ liệu từ máy chủ từ xa và lưu trữ nó trong bảng tạm thời chung. Sau đó, chúng tôi có thể sử dụng dữ liệu nằm trong bảng tạm thời chung để cập nhật bảng mục tiêu.

Như tôi đã đề cập, trước hết chúng ta phải nhập dữ liệu từ bảng từ xa. Để làm điều đó, hãy tạo một bảng tạm thời và nhập dữ liệu bằng hàm OPENROWSET.
Truy vấn sau sẽ tạo một bảng tạm thời chung.

 sử dụng Product_MastergoCREATE TABLE ## Source_Trn_Order ([ID] [int] IDENTITY (1,1) NOT NULL, [Product_ID] [varchar] (15) NOT NULL, [Order_Qty] [int] NULL, [Ordered_Date] [datetime ] NULL, [Last_Ordered_Date] [datetime] NULL) 

Sau khi tạo bảng tạm thời, hãy tải dữ liệu từ bảng nguồn nằm trên máy chủ từ xa. Để làm điều đó, hãy thực hiện truy vấn sau:

 insert vào ## Source_Trn_Order chọn [Product_ID], [Order_Qty], [Order_Date], [Last_Ordered_Date] từ OPENROWSET ('SQLNCLI', 'Server =TTI609-VM1; Trusted_Connection =yes;', 'SELECT Product_ID, Order_Qty, Order_Date, Last_Ordered_Date FROM Inventory_Details.dbo.TrnOrder ') AS a; 

Bước 1:Nếu sản phẩm tồn tại trong MstStock (Bảng mục tiêu) và TrnOrder (Bảng nguồn) thì hãy cập nhật số lượng hiện tại trong MstStock

Để làm điều đó, hãy sử dụng nút KHI ĐÃ KẾT HỢP mệnh đề. Mệnh đề kết hợp các bảng Nguồn và Mục tiêu trên các cột chung của cả hai bảng. Product_ID cột phổ biến giữa MstStock ## Source_Trn_Table, do đó sử dụng nó để tham gia cả hai bảng.

Thực thi đoạn mã sau:

 MERGE MstStock target_StockUSING ## Source_Trn_Order Source_OrderON target_Stock.Product_Id =Source_Order.Product_Id KHI ĐÃ ĐẾN NGÀY CẬP NHẬT THIẾT LẬP target_Stock.Current_Stock =Source_Order.Ordered_Stock.Chính + target 

Giá trị của cột Current_Stock của 4 sản phẩm nên được cập nhật. Thực thi truy vấn sau để xác minh kết quả đầu ra:

 select b.Product_ID, b.Product_Name, a.Current_Stock, a.Last_Stock_Update_Date từ MstStock một tham gia bên trong MstProduct b trên a.Product_ID =b.Product_ID và a.Current_Stock> 0 

Sau đây là kết quả:

Bước 2:Nếu Sản phẩm không tồn tại trong MstStock (Bảng mục tiêu), hãy thêm Sản phẩm đó vào MstStock (Bảng mục tiêu)

Cửa hàng dược phẩm đã đặt một vài sản phẩm. Những sản phẩm đó đã được thêm vào bảng MstProduct nhưng không được thêm vào bảng MstStock. Để thêm các sản phẩm đó vào MstStock bảng, tôi sẽ sử dụng mệnh đề WHEN NOT MATCHED [TARGET]. Mệnh đề kết hợp các bảng nguồn và bảng đích bằng cách sử dụng các cột chung. Nếu không tìm thấy các hàng phù hợp trong bảng đích thì bảng đó sẽ chèn các hàng từ bảng nguồn.

Để thêm sản phẩm vào MstStock sử dụng MERGE bảng, thực thi đoạn mã sau:

 MERGE mststock target_Stockusing ## source_trn_order Source_OrderON target_Stock.product_id =source_order.product_idWHEN phù hợp SAU ĐÓ CẬP NHẬT ĐẶT target_Stock.current_stock =Source_Order.ordered_qty + target_Stock.cock_stock hiện tại, INENSOck_Sản phẩm cuối cùng_dock_stock last_stock_update_date) VALUES (Source_Order.product_id, Source_Order.ordered_qty, Getdate ()); 

Hai ID sản phẩm, MED169 MED170, nên được thêm vào. Thực thi truy vấn sau để xem lại kết quả đầu ra:

 select b.Product_ID, b.Product_Name, a.Current_Stock, a.Last_Stock_Update_Date từ MstStock một tham gia bên trong MstProduct b trên a.Product_ID =b.Product_ID và a.Current_Stock> 0 

Sau đây là đầu ra:

Bước 3:Xóa Mặt hàng khỏi MstStock (Bảng mục tiêu), nếu lượng hàng hiện tại trong MstStock (Bảng mục tiêu) bằng 0 và sản phẩm không có trong ## Source_Trn_Order (bảng nguồn)

Trong hàng tồn kho, có rất ít sản phẩm cần phải xóa vì những sản phẩm đó đã không được đặt hàng trong một năm. Do đó, chúng tôi phải xóa chúng khỏi MstStock bảng và bảng MstProducts. Để xóa các sản phẩm đó khỏi MstStock bảng, chúng ta có thể sử dụng KHI CHƯA ĐƯỢC KẾT HỢP [NGUỒN] .

KHI CHƯA ĐỐI VỚI [NGUỒN] mệnh đề tham gia bảng nguồn và bảng đích bằng cách sử dụng các cột chung. Nếu không tìm thấy các hàng phù hợp trong bảng nguồn, nó sẽ xóa các hàng khỏi bảng đích.

Để xóa sản phẩm khỏi MstStock bảng, thực thi đoạn mã sau:

 MERGE mststock target_Stockusing ## source_trn_order Source_OrderON target_Stock.product_id =source_order.product_idWHEN phù hợp SAU ĐÓ CẬP NHẬT ĐẶT target_Stock.current_stock =Source_Order.ordered_qty + target_Stock.cock_stock hiện tại, INENSOck_Sản phẩm cuối cùng_dock_stock last_stock_update_date) VALUES (Source_Order.product_id, Source_Order.ordered_qty, Getdate ()) KHI KHÔNG khớp BẰNG NGUỒN NÀO THÌ XÓA; 

Hai ID sản phẩm, MED158 MED159 nên được thêm vào. Thực thi truy vấn sau để xem lại kết quả đầu ra:

 select b.Product_ID, b.Product_Name, a.Current_Stock, a.Last_Stock_Update_Date từ MstStock một tham gia bên trong MstProduct b trên a.Product_ID =b.Product_ID và a.Current_Stock> 0 

Sau đây là đầu ra:

Tóm tắt

Trong bài viết này tôi đã trình bày như sau:

  1. Từ khóa MERGE là gì và nó hoạt động như thế nào?
  2. Các mệnh đề khác nhau được sử dụng trong MERGE để cập nhật bảng nguồn và bảng đích.
  3. Cách sửa đổi dữ liệu bằng từ khóa MERGE khi cơ sở dữ liệu nằm trên các máy chủ khác nhau.

Các công cụ hữu ích:

dbForge Data Compare dành cho SQL Server - công cụ so sánh SQL mạnh mẽ có khả năng làm việc với dữ liệu lớn.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cơ sở dữ liệu chỉ sao lưu trong WHM

  2. KNIME

  3. Tải xuống bản sao cơ sở dữ liệu của bạn

  4. SQL Cheat Sheet:SQL, SQL Commands và SQL Injection là gì

  5. Cách thay thế một phần của chuỗi trong SQL