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

Sự cố với câu lệnh SQL Server MERGE

Bất kỳ giá trị nào trong số bốn giá trị trong #S sẽ khớp với giá trị hàng đơn của bảng mục tiêu của bạn (tất cả các giá trị trong #S có id =1 và name ='A' - vì vậy tất cả chúng đều khớp với hàng đơn trong mục tiêu), do đó giá trị này sẽ được cập nhật bốn lần - đó là lỗi nói, và nó hoàn toàn đúng.

Bạn thực sự muốn đạt được điều gì ở đây ??

Bạn có muốn đặt Địa chỉ thành giá trị đầu tiên từ bảng nguồn không? Sử dụng TOP 1 mệnh đề trong lựa chọn con của bạn:

MERGE #T 
USING (SELECT TOP 1 id, name, address FROM #S) AS S
ON #T.id = S.id AND #T.Name = S.Name
WHEN NOT MATCHED THEN
    INSERT VALUES(S.id,S.Name, S.Address)
WHEN MATCHED THEN
    UPDATE SET Address = S.Address;

Bạn có muốn đặt Địa chỉ thành một phần tử ngẫu nhiên của các giá trị từ bảng nguồn không? Sử dụng TOP 1ORDER BY NEWID() mệnh đề trong lựa chọn con của bạn:

MERGE #T 
USING (SELECT TOP 1 id, name, address FROM #S ORDER BY NEWID()) AS S
ON #T.id = S.id AND #T.Name = S.Name
WHEN NOT MATCHED THEN
    INSERT VALUES(S.id,S.Name, S.Address)
WHEN MATCHED THEN
    UPDATE SET Address = S.Address;

Nếu bạn so khớp bốn hàng nguồn với một hàng mục tiêu, bạn sẽ không bao giờ nhận được kết quả hữu ích - bạn cần biết mình thực sự muốn gì.

Marc



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tầng một ngày trong máy chủ SQL

  2. Nội bộ của bảy loại máy chủ SQL - Phần 2

  3. Ký tự đường ống / thanh veritcal trong TSQL có nghĩa là gì?

  4. SQL Server:nối và nối các cột

  5. Làm thế nào để bắt SqlException gây ra bởi deadlock?