2009-02-27 9 views

Odpowiedz

8

Cóż, w pewnym momencie będziemy musieli sprawdzić wszystkie kolumny - równie dobrze może dostać łączenia ...

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 

To powinno wystarczyć ... Jest również CHECKSUM(*), ale ten tylko pomaga - nadal musisz sprawdzić rzeczywiste wartości, aby wykluczyć konflikty hash.

+5

Działa to dobrze, o ile żadna z kolumn zawiera wartości null. Tak szybko, jak to się stanie, musisz zacząć mieszać się ze złożonymi warunkami, takimi jak (a.Nazwa = b.Nazwa LUB (a.Nazwa IS NULL I b.Nazwa IS NULL)) dla każdej kolumny z wartościami zerowymi. Kolejny powód, dla którego warto unikać wartości null. –

+0

@Marc Gravell, Jeśli tabela 'a' i tabela' b' obecne w 'widoku'. Jak mogę usunąć duplikaty wierszy i zachować oryginał raz? Opublikowalem [http://stackoverflow.com/questions/32065340/sql-server-2008-r2-delete-duplicate-rows-from-tables-containing-in-view/32065972?noredirect=1#comment52032907_32065972] na takich sytuacja. – MAK

+0

Używanie INTERSECT i EXCEPT (zobacz inną odpowiedź) dla tego typu operacji pozwala uniknąć problemu NULL http://sqlblog.com/blogs/paul_white/archive/2011/06/22/undocumented-query-plans-equality-comparisons.aspx – ryascl

1

Myślę, że poniżej psuedocode zrobi to ..

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 

Chrisa INTERSECT post jest o wiele bardziej elegancki i choć użyję, że w przyszłości zamiast wypisując wszystkie kryteria zewnętrznej przyłączyć :)

0

Chciałbym spróbować zapytanie DISTINCT i wykonaj połączenie dwóch tabel.

Możesz użyć języka skryptowego, takiego jak asp/php, aby sformatować dane wyjściowe w szeregu instrukcji wstawiania, aby odbudować tabelę wynikowych niepowtarzalnych danych.

8

Jeśli używasz SQL Server 2005, można użyć intersect:

delete * from table1 intersect select * from table2 
0

spróbuj tego:

DELETE t1 FROM t1 INNER JOIN t2 ON t1.name = t2.name WHERE t1.id = t2.id 
Powiązane problemy