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

Ví dụ về câu lệnh hợp nhất đơn giản trong SQL Server

Ví dụ sau sử dụng T-SQL để hợp nhất hai bảng trong SQL Server. Nó sử dụng VALUES hàm tạo giá trị bảng làm bảng nguồn.

Giả sử chúng ta tạo một bảng như sau:

CREATE TABLE Idiots (
    IdiotId int IDENTITY(1,1) NOT NULL,
    FirstName varchar(50),
    LastName varchar(50)
    );

INSERT INTO Idiots VALUES 
    ('Peter', 'Griffin'), 
    ('Homer', 'Simpson'), 
    ('Ned', 'Flanders');

SELECT * FROM Idiots;

Kết quả:

+-----------+-------------+------------+
| IdiotId   | FirstName   | LastName   |
|-----------+-------------+------------|
| 1         | Peter       | Griffin    |
| 2         | Homer       | Simpson    |
| 3         | Ned         | Flanders   |
+-----------+-------------+------------+

Và giả sử chúng ta muốn thực hiện thao tác hợp nhất. Chúng tôi muốn chèn các hàng mới, nhưng nếu một hàng đã tồn tại với các giá trị khớp với các giá trị trong nguồn của chúng tôi, thì chúng tôi muốn cập nhật hàng hiện có thay thế (thay vì chèn một hàng mới).

Chúng ta có thể làm như thế này:

DECLARE @Changes TABLE(Change VARCHAR(20));

MERGE INTO Idiots AS Target  
USING ( VALUES 
            (3, 'Ned', 'Okily Dokily!'), 
            (4, 'Lloyd','Christmas'), 
            (5, 'Harry', 'Dunne')
        ) AS Source ( IdiotId, FirstName, LastName )  
ON Target.IdiotId = Source.IdiotId
AND Target.FirstName = Source.FirstName
WHEN MATCHED THEN
    UPDATE SET FirstName = Source.FirstName, LastName = Source.LastName
WHEN NOT MATCHED BY TARGET THEN
    INSERT (FirstName, LastName) VALUES (Source.FirstName, Source.LastName)
OUTPUT $action INTO @Changes;

SELECT Change, COUNT(*) AS Count  
FROM @Changes  
GROUP BY Change;

Kết quả:

+----------+---------+
| Change   | Count   |
|----------+---------|
| INSERT   | 2       |
| UPDATE   | 1       |
+----------+---------+

Hai hàng mới đã được chèn và một hàng đã được cập nhật.

Ở đây, chúng tôi đã sử dụng một hàm tạo giá trị bảng (VALUES ) để chỉ định các giá trị mới cho bảng.

Trong trường hợp này, chúng tôi đã kiểm tra IdiotIdFirstName cột. Về cơ bản, nếu ID và tên giống nhau, thì chúng tôi muốn cập nhật hàng hiện có thay vì chèn một hàng mới.

Chúng tôi đã sử dụng WHEN MATCHED để chỉ định điều gì sẽ xảy ra khi dữ liệu từ VALUES của chúng tôi mệnh đề khớp với dữ liệu trong bảng đích. Trong trường hợp này, chúng tôi chỉ cần cập nhật hàng với dữ liệu mới từ VALUES .

Chúng tôi đã sử dụng WHEN NOT MATCHED BY TARGET để chỉ định điều gì sẽ xảy ra khi không có kết quả phù hợp. Trong trường hợp này, chúng tôi chèn một hàng mới với dữ liệu mới.

Chúng tôi cũng đã sử dụng một biến có tên là @Changes để xem kết quả của hoạt động hợp nhất của chúng tôi. Chúng tôi đã sử dụng OUTPUT mệnh đề sau khi hoạt động hợp nhất cho điều này. Đó là những gì đã cung cấp cho chúng tôi bảng kết quả ở trên.

Bây giờ chúng ta có thể kiểm tra bảng mục tiêu để xem tác động của hoạt động hợp nhất đối với nó:

SELECT * FROM Idiots;

Kết quả:

+-----------+-------------+---------------+
| IdiotId   | FirstName   | LastName      |
|-----------+-------------+---------------|
| 1         | Peter       | Griffin       |
| 2         | Homer       | Simpson       |
| 3         | Ned         | Okily Dokily! |
| 4         | Lloyd       | Christmas     |
| 5         | Harry       | Dunne         |
+-----------+-------------+---------------+

Chúng ta có thể thấy rằng tên ngốc số 3 (Ned) đã được cập nhật họ của mình. Chúng ta cũng có thể thấy rằng hai tên ngốc mới đã được thêm vào bảng (Lloyd và Harry).


  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ách bật Tất cả Ràng buộc CHECK &Khóa ngoại trong Cơ sở dữ liệu trong SQL Server (Ví dụ T-SQL)

  2. Lỗi CTE:Các loại không khớp giữa phần neo và phần đệ quy

  3. Thế tiến thoái lưỡng nan về đặt tên bảng:Tên số ít so với số nhiều

  4. Các tùy chọn giám sát cơ sở dữ liệu hàng đầu có sẵn cho doanh nghiệp của bạn

  5. LOG () Ví dụ trong SQL Server