2013-05-09 5 views
0

quelqu'un d'autre Editing conception SQL Server ici:supprimer des enregistrements de 2 tables après le test pour voir si elles sont des doublons

J'ai été chargé avec la suppression des lignes en double d'une base de données. J'ai 2 tables: table1 et table2.

  • table1 a colonnes T1ID, and T1NAME
  • table2 a colonnes T2ID, DATA1, DATA2, DATA3

  • Tables rejoindre sur T1ID = T2ID

Si plusieurs lignes ont la même T1NAME, DATA1, DATA2, ETDATA3, j'ai besoin pour supprimer tous sauf un d'entre les deux tables.

+0

Qu'est-ce que [SGBDR] (http://en.wikipedia.org/wiki/Relational_database_management_system) que vous utilisez? 'RDBMS' signifie * Relational Database Management System *. 'RDBMS est la base pour SQL', et pour tous les systèmes de base de données modernes comme MS SQL Server, IBM DB2, Oracle, MySQL, etc ... –

+0

whups ... va éditer la question: MS SQL Server – user2366153

+0

Pour les enregistrements en double, sont-ils avoir des ID différents (T1ID, T2ID). Comprendre à partir de la question que T1ID = T2ID, mais si deux lignes (A et B) ont le même nom et les données, est-ce que T1ID (pour A) = T1ID (pour B)? – user1676075

Répondre

0

Je suppose que t1id dans le tableau 1 et t2id dans table2 est la clé primaire pour les tables correpondant.

si oui la vous pouvez utiliser l'approche suivante -

1) que vous souhaitez supprimer à la fois les tables, vous devez stocker les t1id (ou t2id) dans une table temporaire de sorte que vous pouvez utiliser les valeurs pour la suppression de la deuxième table

2) pour extraire le t1id/t2id désiré, vous devez grouper la table jointe avec T1name, Data1, Data2, Data3 et sélectionner l'enregistrement où vous obtenez plusieurs enregistrements.

3) Exclure un seul t1id des enregistrements en double trouvés pour la suppression.

donc pour cela, vous pouvez utiliser certaines commandes comme ci-dessous -

CREATE TABLE test_table 
as (SELECT T1id 
     FROM Table1, Table2 
    WHERE T1name, Data1, Data2, 
    Data3 IN (SELECT T1name, Data1, Data2, Data3 
         FROM (SELECT T1name, Data1, Data2, Data3, COUNT(*) 
           FROM Table1, Table2 
           WHERE T1id = T2id 
           GROUP BY T1name, Data1, Data2, Data3 
          HAVING COUNT(*) > 1)) 
     AND T1id NOT IN (SELECT MIN(T1id) 
          FROM Table1, Table2 
         WHERE T1id = T2id 
         GROUP BY T1name, Data1, Data2, Data3)); 

DELETE FROM Table1 WHERE T1id IN (SELECT T1id FROM Test_Table); 

DELETE FROM Table2 WHERE T2id IN (SELECT T1id FROM Test_Table); 

COMMIT; 

Drop TABLE Test_Table; 
+0

GOT IT. Je vais faire un essai ... Je pense que j'essayais trop fort pour que tout devienne une commande et votre méthode évite juste toute la question. Merci de bien vouloir! – user2366153

0

Non testé, mais essayer quelque chose comme ça

;with deleteThis 
as 
(
select t1.id 
     ,t2.data1 
     ,t2.data2 
     ,t2.data3 
     ,row_number() over(partition by t1.id,t2.data1,t2.data2,t2.data3 order by t1.id) as rn 
from table1 as t1 
inner join table2 as t2 
on t2.id = t1.id 
) 
delete from deleteThis 
where rn > 1 
+0

Cela ne supprimerait-il pas ** toutes ** les lignes où des doublons existent? Le PO a dit qu'il doit garder ** une ligne ** s'il y en a plusieurs .... –

+0

vous avez eu raison. – wootscootinboogie

+0

Est-ce que cela ne supprimerait pas seulement le contenu de la table1? – user2366153

Questions connexes