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

Hợp nhất dữ liệu thành hai bảng đích

Về mặt lý thuyết, cần có một giải pháp để thực hiện điều này trong một câu lệnh duy nhất, nhưng tôi vẫn chưa tìm ra nó. *

Đây là cách nó có thể được thực hiện với hai MERGE tuyên bố:

WITH CTE_trgt AS 
(
    SELECT c.compid, c.ownerid, t.projid, t.active 
    FROM component c
    INNER JOIN trace t ON c.compid = t.compid
)
MERGE CTE_trgt t
USING Donor s
ON t.projid = s.projid
WHEN NOT MATCHED BY TARGET
    THEN INSERT (ownerid)
    VALUES (s.ownerid)
OUTPUT
    INSERTED.compid, s.projid, 1 INTO trace;


MERGE trace t
USING Donor s
ON t.projid = s.projid
WHEN NOT MATCHED BY SOURCE 
    THEN UPDATE SET t.active = 0;

SQLFiddle DEMO

* Phần cập nhật cột Hoạt động:

WHEN NOT MATCHED BY SOURCE 
    THEN UPDATE SET t.active = 0

sẽ có thể phù hợp với truy vấn phía trên tạo câu lệnh hợp nhất duy nhất cho tất cả các hoạt động, nhưng nó gây ra lỗi:

ngay cả khi đó rõ ràng là một cột duy nhất và cập nhật không hợp nhất thường xuyên hoạt động tốt . Có thể ai đó biết lý do và / hoặc giải pháp cho việc này.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Truy vấn SQL Server:hàng tạo cột (Xoay vòng?)

  2. Cách nhận dữ liệu 7 ngày qua từ ngày hiện tại đến 7 ngày qua trong máy chủ sql

  3. SQL Server 2008 sử dụng CPU cao

  4. SQL Server 2008 chuyển kiểu dữ liệu làm tham số cho hàm

  5. Cách sử dụng Câu lệnh Trường hợp để Định dạng có Điều kiện trong Truy vấn Chọn - Hướng dẫn SQL Server / TSQL Phần 116