2012-03-12 13 views
7

Tôi có hai bảng lớn (4 triệu bản ghi) có cấu trúc giống nhau và chúng có khoảng 300 nghìn hàng trùng lặp. Tôi muốn DELETE các hàng trùng lặp bằng cách sử dụng cú pháp DELETE IN.
Nhiều biểu thức với IN

Tôi đã thực hiện nó bằng cách sử dụng câu lệnh MERGE (chỉ khả dụng vào năm 2008 hoặc mới hơn, vì vậy tôi không thể sử dụng nó kể từ khi tôi vẫn chạy 2005) và DELETE EXISTS, nhưng tôi đang chạy vào một số gặp sự cố khi nhận được DELETE IN để hoạt động.

Vấn đề mà tôi đang gặp phải với DELETE IN là bảng lớn của tôi có khóa chính kết hợp, có nghĩa là tôi chỉ có thể xác định các hàng duy nhất sử dụng tất cả các cột đó cùng nhau.

Có thể trong T-SQL có nhiều biểu thức làm tham số cho mệnh đề IN không? Một cái gì đó như:

DELETE FROM MyBigTable 
WHERE ([Column1], [Column2], [Column3]) IN 
    (SELECT [Column1], 
      [Column2], 
      [Column3] 
    FROM MyBigTable 
    INTERSECT 
    SELECT [Column1], 
      [Column2], 
      [Column3] 
    FROM MyOtherBigTable) 
+5

này được SQL cú pháp tiêu chuẩn hợp lệ (! Nếu bạn thay thế những dấu ngoặc vuông với dấu ngoặc kép) nhưng chưa được hỗ trợ trong SQL Máy chủ, Bạn có thể bỏ phiếu [ở đây] (http://connect.microsoft.com/SQLServer/feedback/details/299231/add-support-for-ansi-standard-row-value-constructors) để đưa vào. – onedaywhen

+0

Nếu bạn muốn cú pháp này được hỗ trợ trong phiên bản SQL Server trong tương lai, vui lòng bỏ phiếu và nhận xét: http://connect.microsoft.com/SQLServer/feedback/details/299231/add-support-for-ansi-standard-row- nhà thầu có giá trị –

Trả lời

14

Bạn chỉ có thể làm một JOIN cho việc này:

DELETE A 
FROM MyBigTable A 
INNER JOIN MyOtherBigTable B 
ON A.Column1 = B.Column1 AND A.Column2 = B.Column2 AND A.Column3 = B.Column3