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

MERGE INTO thứ tự chèn

Tôi không thể nói những gì Người hỏi đang yêu cầu ở đây vì nó không tạo ra bất kỳ giác quan.

Vì vậy, hãy giả sử một vấn đề khác:

Thay vào đó, hãy giả sử rằng tôi có một Bảng Heap không có Trường Danh tính, nhưng nó có " Đã truy cập "Trường ngày tháng.
Bảng đống ghi nhật ký Lượt truy cập trang Web của Người và tôi đang tải nó vào Kho dữ liệu của mình.
Trong Kho dữ liệu này, tôi muốn sử dụng Khoá thay thế" WebHitID "để tham chiếu các mối quan hệ này.
Hãy sử dụng Merge để thực hiện tải ban đầu của bảng, sau đó tiếp tục gọi nó để giữ cho các bảng được đồng bộ hóa.

Tôi biết rằng nếu tôi đang chèn các bản ghi vào một bảng, sau đó tôi muốn ID (đang được tạo bởi Trường nhận dạng) tuần tự dựa trên bất kỳ Thứ tự theo nào tôi chọn (giả sử " Đã truy cập "Ngày).
Không có gì lạ khi mong đợi một Integer-ID tương quan với thời điểm nó được tạo so với phần còn lại của các bản ghi trong bảng.
Tôi biết điều này không phải lúc nào cũng đúng 100%. , nhưng hãy làm tôi hài hước trong giây lát.

Điều này có thể thực hiện được với Merge.

Sử dụng (cảm giác giống như một hack ) TOP sẽ cho phép Sắp xếp trong Phụ trang của chúng tôi:

MERGE DW.dbo.WebHit AS Target --This table as an Identity Field called WebHitID.
USING
(
    SELECT TOP 9223372036854775807 --Biggest BigInt (to be safe).
           PWV.PersonID, PWV.WebPageID, PWV.Visited
      FROM ProdDB.dbo.Person_WebPage_Visit AS PWV
     ORDER BY PWV.Visited --Works only with TOP when inside a MERGE statement.
) AS Source
  ON Source.PersonID  = Target.PersonID
 AND Source.WebPageID = Target.WebPageID
 AND Source.Visited   = Target.Visited
WHEN NOT MATCHED BY Target THEN --Not in Target-Table, but in Source-Table.
    INSERT (PersonID, WebPageID, Visited) --This Insert populates our WebHitID.
    VALUES (Source.PersonID, Source.WebPageID, Source.Visited)
WHEN NOT MATCHED BY Source THEN --In Target-Table, but not in Source-Table.
    DELETE --In case our WebHit log in Prod is archived/trimmed to save space.
;


Bạn có thể thấy tôi đã chọn sử dụng TOP 9223372036854775807 (Số nguyên lớn nhất hiện có) để kéo mọi thứ.
Nếu bạn có đủ tài nguyên để hợp nhất nhiều hơn thế, thì bạn nên chia nhỏ nó ra.
> Trong khi điều này hét lên " giải pháp hacky "với tôi, nó sẽ đưa bạn đến nơi bạn cần.

Tôi đã thử nghiệm điều này trên một tập mẫu nhỏ và xác minh rằng nó hoạt động. Tôi chưa nghiên cứu tác động hiệu suất của nó đối với các tập hợp phức tạp lớn hơn của dữ liệu, vì vậy YMMV có và không có TOP.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Hiểu tầm quan trọng của cài đặt bộ nhớ trong SQL Server

  2. Sự khác biệt giữa khóa duy nhất với ràng buộc 'không null' và khóa chính là gì?

  3. Phiên bản .Net framework nào đi kèm với SQL Server 2008?

  4. Cách lấy danh sách các Bảng không có Ràng buộc khóa chính trong tất cả Cơ sở dữ liệu của Phiên bản SQL Server - Hướng dẫn SQL Server / TSQL Phần 62

  5. Cách truyền varchar sang XML trong một truy vấn ÁP DỤNG NGOÀI TRỜI