Comment supprimer des lignes en double là où il n'en unique row id
existe pas ?
Ma table est
col1 col2 col3 col4 col5 col6 col7
john 1 1 1 1 1 1
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
sally 2 2 2 2 2 2
Je souhaite conserver les éléments suivants après la suppression des doublons:
john 1 1 1 1 1 1
sally 2 2 2 2 2 2
J'ai essayé quelques requêtes mais je pense qu'elles dépendent d'un identifiant de ligne car je n'obtiens pas le résultat souhaité. Par exemple:
DELETE
FROM table
WHERE col1 IN (
SELECT id
FROM table
GROUP BY id
HAVING (COUNT(col1) > 1)
)
mysql
sql
sql-server-2008
duplicates
sql-delete
Fearghal
la source
la source
Réponses:
J'aime les CTE et
ROW_NUMBER
comme les deux combinés nous permettent de voir quelles lignes sont supprimées (ou mises à jour), il suffit donc de changer leDELETE FROM CTE...
enSELECT * FROM CTE
:DEMO (le résultat est différent; je suppose que c'est dû à une faute de frappe de votre part)
Cet exemple détermine les doublons par une seule colonne en
col1
raison de laPARTITION BY col1
. Si vous souhaitez inclure plusieurs colonnes, ajoutez-les simplement àPARTITION BY
:la source
AND COl1='John'
). Normalement, vous devez appliquer le filtre dans le CTE....FROM dbo.Table1 WHERE Col1='John'
. Voici le violon: sqlfiddle.com/#!6/fae73/744/0set rowcount 1 delete from t1 where col1=1 and col2=1
que l'on voit iciJe préférerais CTE pour supprimer les lignes en double de la table du serveur SQL
recommande fortement de suivre cet article :: http://codaffection.com/sql-server-article/delete-duplicate-rows-in-sql-server/
la source
Sans utiliser
CTE
etROW_NUMBER()
vous pouvez simplement supprimer les enregistrements en utilisant simplement group by avec laMAX
fonction voici et exemplela source
MIN(ID)
la source
Veuillez également consulter le mode de suppression ci-dessous.
Créé un exemple de table nommée
@table
et chargé avec les données fournies.Remarque: Si vous donnez toutes les colonnes de la
Partition by
pièce,order by
cela n'a pas beaucoup d'importance.Je sais, la question a été posée il y a trois ans, et ma réponse est une autre version de ce que Tim a publié, mais publier juste au cas où cela serait utile pour n'importe qui.
la source
Si vous n'avez pas de références, comme des clés étrangères, vous pouvez le faire. Je le fais beaucoup lors des tests de preuves de concept et les données de test sont dupliquées.
Allez dans l'explorateur d'objets et supprimez l'ancienne table.
Renommez la nouvelle table avec le nom de l'ancienne table.
la source
Microsoft a un très bon guide sur la façon de supprimer les doublons. Consultez http://support.microsoft.com/kb/139444
En bref, voici le moyen le plus simple de supprimer les doublons lorsque vous n'avez que quelques lignes à supprimer:
myprimarykey est l'identifiant de la ligne.
Je règle le nombre de lignes sur 1 car je n'avais que deux lignes qui ont été dupliquées. Si j'avais eu 3 lignes dupliquées, j'aurais réglé le nombre de lignes sur 2 pour qu'il supprime les deux premières qu'il voit et n'en laisse qu'une dans le tableau t1.
J'espère que cela aide n'importe qui
la source
Essayez d'utiliser:
la source
Après avoir essayé la solution suggérée ci-dessus, cela fonctionne pour les petites tables moyennes. Je peux suggérer cette solution pour de très grandes tables. car il s'exécute en itérations.
LargeSourceTable
sp_rename 'LargeSourceTable', 'LargeSourceTable_Temp'; GO
LargeSourceTable
nouveau, mais maintenant, ajoutez une clé primaire avec toutes les colonnes qui définissent les doublons ajouterWITH (IGNORE_DUP_KEY = ON)
Par exemple:
CREATE TABLE [dbo].[LargeSourceTable] ( ID int IDENTITY(1,1), [CreateDate] DATETIME CONSTRAINT [DF_LargeSourceTable_CreateDate] DEFAULT (getdate()) NOT NULL, [Column1] CHAR (36) NOT NULL, [Column2] NVARCHAR (100) NOT NULL, [Column3] CHAR (36) NOT NULL, PRIMARY KEY (Column1, Column2) WITH (IGNORE_DUP_KEY = ON) ); GO
Créez à nouveau les vues que vous avez supprimées en premier lieu pour la nouvelle table créée
Maintenant, exécutez le script sql suivant, vous verrez les résultats dans 1 000 000 lignes par page, vous pouvez changer le numéro de ligne par page pour voir les résultats plus souvent.
Notez que j'ai activé
IDENTITY_INSERT
et désactivé car l'une des colonnes contient un identifiant incrémentiel automatique, que je copie égalementSET IDENTITY_INSERT LargeSourceTable ON DECLARE @PageNumber AS INT, @RowspPage AS INT DECLARE @TotalRows AS INT declare @dt varchar(19) SET @PageNumber = 0 SET @RowspPage = 1000000
select @TotalRows = count (*) from LargeSourceTable_TEMP
SET IDENTITY_INSERT LargeSourceTable OFF
la source
Il existe deux solutions
mysql
:A) Supprimer les lignes en double à l'aide de l'
DELETE JOIN
instructionCette requête fait référence deux fois à la table des contacts. Par conséquent, elle utilise l'alias de table
t1
ett2
.La sortie est:
Dans le cas où vous souhaitez supprimer des lignes en double et conserver le
lowest id
, vous pouvez utiliser l'instruction suivante:B) Supprimer les lignes en double à l'aide d'une table intermédiaire
Voici les étapes de suppression des lignes en double à l'aide d'une table intermédiaire:
1. Créez un nouveau tableau avec la même structure que le tableau d'origine dont vous souhaitez supprimer les lignes en double.
2. Insérez des lignes distinctes de la table d'origine dans la table immédiate.
3. Insérez des lignes distinctes de la table d'origine dans la table immédiate.
Étape 1. Créez une nouvelle table dont la structure est la même que la table d'origine:
Étape 2. Insérez des lignes distinctes de la table d'origine dans la nouvelle table:
Étape 3. déposez la table d'origine et renommez la table immédiate en celle d'origine
Source: http://www.mysqltutorial.org/mysql-delete-duplicate-rows/
la source
la source
Vous devez regrouper les enregistrements en double en fonction du ou des champs, puis conserver l'un des enregistrements et supprimer le reste. Par exemple:
la source
La suppression des doublons d'une énorme table (plusieurs millions d'enregistrements) peut prendre du temps. Je vous suggère de faire une insertion en bloc dans une table temporaire des lignes sélectionnées plutôt que de supprimer.
la source
Cela peut être fait de plusieurs façons dans le serveur SQL. La façon la plus simple de le faire est: d'insérer les lignes distinctes de la table des lignes en double dans la nouvelle table temporaire. Ensuite, supprimez toutes les données de la table des lignes en double, puis insérez toutes les données de la table temporaire qui n'a pas de doublons, comme indiqué ci-dessous.
Supprimer les lignes en double à l'aide de Common Table Expression (CTE)
la source
la source
En référence à https://support.microsoft.com/en-us/help/139444/how-to-remove-duplicate-rows-from-a-table-in-sql-server
L'idée de supprimer les doublons implique
Pas à pas
la source
Si vous avez la possibilité d'ajouter temporairement une colonne à la table, c'était une solution qui a fonctionné pour moi:
Effectuez ensuite une SUPPRESSION en utilisant une combinaison de MIN et GROUP BY
Vérifiez que la suppression a été effectuée correctement:
Le résultat ne doit avoir aucune ligne avec un nombre supérieur à 1. Enfin, supprimez la colonne rowid:
la source
Une autre façon de supprimer des lignes dupliquées sans perdre d'informations en une seule étape est la suivante:
la source
Oh wow, je me sens tellement stupide en prêtant toutes ces réponses, elles sont comme la réponse des experts avec toutes les tables CTE et temp et etc.
Et tout ce que j'ai fait pour le faire fonctionner, c'est simplement agréger la colonne ID en utilisant MAX.
REMARQUE: vous devrez peut-être l'exécuter plusieurs fois pour supprimer les doublons, car cela ne supprimera qu'un seul ensemble de lignes en double à la fois.
la source
la source
la source