2009-02-27 13 views

cevap

8

Eh, tüm sütunları kontrol etmek zorunda gidiyoruz bir noktada - yanı katılmadan alabilirsiniz ...

bunu edip ... ayrıca CHECKSUM(*) var
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 

ama bu Sadece , yardımcı olur - karma karmaşayı önlemek için gerçek değerleri hala kontrol etmeniz gerekir.

+5

Bu sürece sütunların hiçbiri boş değerlere içerdiğinden güzel çalışıyor. Bu olur olmaz, her nullable sütun için (a.Name = b.Name VEYA (a.Name IS NULL AND b.Name IS NULL) gibi karmaşık koşullarla uğraşmaya başlamalısınız. Boşu boşa çıkarmak için başka bir sebep. –

+0

@Marc Gravell, Tablo "a" ve "b" tablosunda "görünüm". Sonra yinelenen satırları nasıl silebilirim ve orijinali bir kez nasıl saklayabilirim? Bu konuda [http://stackoverflow.com/questions/32065340/sql-server-2008-r2-delete-duplicate-rows-from-tables-containing-in-view/32065972?noredirect=1#comment52032907_32065972] gönderdim durum. – MAK

+0

Bu tür işlemler için INTERSECT ve EXCEPT öğelerini (bkz. Diğer yanıtlar) kullanmak NULL sorununu ortadan kaldırır http://sqlblog.com/blogs/paul_white/archive/2011/06/22/undocumented-query-plans-equality-comparisons.aspx – ryascl

1

aşağıda psuedocode yapacağını düşünüyorum ..

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 

Chris'in INTERSECT sonrası olsa çok daha zarif ve ben dış birleşim hepsini yazmak yerine gelecekte bu kullanacağız kriterleri katılmak :)

0

Bir DISTINCT sorgusunu deneyebilir ve iki tablonun birleşimini yaparım.

Tabloyu ortaya çıkan benzersiz verileri yeniden oluşturmak için çıktıyı bir dizi ekleme ifadesine biçimlendirmek için asp/php gibi bir komut dosyası dili kullanabilirsiniz.

8

SQL Server 2005 kullanıyorsanız, size intersect kullanabilirsiniz:

delete * from table1 intersect select * from table2 
0

bu deneyin:

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