2009-02-27 2 views

Trả lời

8

Vâng, tại một số điểm bạn sẽ phải kiểm tra tất cả các cột - cũng có thể nhận được khi tham gia ...

DELETE a 
FROM a -- first table 
INNER JOIN b -- second table 
     ON b.ID = a.ID 
     AND b.Name = a.Name 
     AND b.Foo = a.Foo 
     AND b.Bar = a.Bar 

Điều đó sẽ làm điều đó ... cũng có CHECKSUM(*), nhưng điều này chỉ giúp - bạn vẫn cần phải kiểm tra giá trị thực để loại trừ xung đột băm.

+5

này hoạt động độc đáo miễn là không ai trong số các cột chứa null. Ngay sau khi điều đó xảy ra, bạn phải bắt đầu rối tung với các điều kiện phức tạp như (a.Name = b.Name OR (a.Name IS NULL và b.Name IS NULL)) cho mỗi cột nullable. Một lý do khác để loại bỏ null. –

+0

@Marc Gravell, Nếu bảng 'a' và bảng' b' hiện diện trong 'khung nhìn'. Sau đó làm thế nào tôi có thể xóa các hàng trùng lặp và giữ nguyên bản gốc một lần? Tôi đã đăng [http://stackoverflow.com/questions/32065340/sql-server-2008-r2-delete-duplicate-rows-from-tables-containing-in-view/32065972?noredirect=1#comment52032907_32065972] trên đó tình hình. – MAK

+0

Sử dụng INTERSECT và EXCEPT (xem câu trả lời khác) cho các loại hoạt động này tránh vấn đề NULL http://sqlblog.com/blogs/paul_white/archive/2011/06/22/undocumented-query-plans-equality-comparisons.aspx – ryascl

1

Tôi nghĩ rằng psuedocode dưới đây sẽ làm điều đó ..

DELETE FirstTable, SecondTable 
FROM FirstTable 
FULL OUTER JOIN SecondTable 
ON FirstTable.Field1 = SecondTable.Field1 
... continue for all fields 
WHERE FirstTable.Field1 IS NOT NULL 
AND SecondTable.Field1 IS NOT NULL 

INTERSECT bài của Chris là xa thêm thanh lịch và mặc dù tôi sẽ sử dụng trong tương lai thay vì viết ra tất cả các tiêu chí bên ngoài tham gia :)

0

Tôi sẽ thử truy vấn DISTINCT và thực hiện kết hợp hai bảng.

Bạn có thể sử dụng ngôn ngữ kịch bản như asp/php để định dạng đầu ra thành một chuỗi câu lệnh chèn để xây dựng lại bảng dữ liệu duy nhất kết quả.

8

Nếu bạn đang sử dụng SQL Server 2005, bạn có thể sử dụng intersect:

delete * from table1 intersect select * from table2 
0

thử điều này:

DELETE t1 FROM t1 INNER JOIN t2 ON t1.name = t2.name WHERE t1.id = t2.id