2009-02-27 6 views

Répondre

8

Eh bien, à un moment donné, vous allez devoir vérifier toutes les colonnes - pourrait aussi bien se joindre à ...

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 

Cela devrait le faire ... il y a aussi CHECKSUM(*), mais seulement aide - vous aviez encore besoin de vérifier les valeurs réelles de hachage pour exclure les conflits.

+5

Cela fonctionne bien aussi longtemps que aucune des colonnes contient des valeurs nulles. Dès que cela se produit, vous devez commencer à déconner avec des conditions complexes comme (a.Name = b.Name OU (a.Name IS NULL et IS NULL b.Name)) pour chaque colonne nullable. Une autre raison pour éviter les Nuls. –

+0

@Marc Gravell, Si la table 'a' et la table' b' sont présentes dans 'view'. Alors comment puis-je supprimer les lignes en double et conserver l'original une fois? J'ai posté [http://stackoverflow.com/questions/32065340/sql-server-2008-r2-delete-duplicate-rows-from-tables-containing-in-view/32065972?noredirect=1#comment52032907_32065972] sur tel situation. – MAK

+0

Utiliser INTERSECT et EXCEPT (voir autre réponse) pour ces types d'opérations évite le problème NULL http://sqlblog.com/blogs/paul_white/archive/2011/06/22/undocumented-query-plans-equality-comparisons.aspx – ryascl

1

Je pense que le psuedocode ci-dessous le ferait ..

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 

poste INTERSECT Chris est beaucoup plus élégant et si je vais utiliser qu'à l'avenir, au lieu d'écrire tous les critères de jointure externe :)

0

Je voudrais essayer une requête DISTINCT et faire une union des deux tables.

Vous pouvez utiliser un langage de script comme asp/php pour formater la sortie en une série d'instructions d'insertion pour reconstruire la table des données uniques résultant.

8

Si vous utilisez SQL Server 2005, vous pouvez utiliser intersect:

delete * from table1 intersect select * from table2 
0

essayez ceci:

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