Je veux supprimer les enregistrements en double d'une table sans utiliser de table temporaire comment est-ce possible?requête pour supprimer les enregistrements en double d'une table sans utiliser la table temporaire?
requête pour supprimer les enregistrements en double d'une table sans utiliser la table temporaire?
Répondre
- Faire une requête A que vous obtient les lignes qui se qualifient comme des doublons
- Faire un B requête que vous obtient les lignes que vous souhaitez conserver
- Faire une requête qui supprime toutes les lignes qui sont en mais pas dans B.
Exemple.
En supposant une table nommée table
, avec une colonne d'identité autoincrement nommé id
et une colonne nommée name
dont vous voulez supprimer les doubles. De chaque nom, vous voulez conserver l'enregistrement le plus ancien (celui avec l'ID le plus bas).
la requête A ressemble alors quelque chose comme:
SELECT * FROM table
WHERE name IN (SELECT name FROM table GROUP BY name HAVING COUNT(*) > 1)
la requête B serait:
SELECT * FROM table
WHERE id IN (SELECT min(id) FROM table GROUP BY name)
Maintenant, combinons ces pour former la requête de suppression:
DELETE FROM table
WHERE name IN (SELECT name FROM table GROUP BY name HAVING COUNT(*) > 1)
AND NOT id IN (SELECT min(id) FROM table GROUP BY name)
Dans l'exemple À la main, vous pouvez omettre la première requête, mais quand les choses se compliquent, c'est une bonne sauvegarde supplémentaire.
Vous ne pouvez pas. Les enregistrements entièrement dupliqués (ceux qui ont tous les champs égaux) ne peuvent pas être supprimés par un, car vous ne pouvez pas les différencier dans une clause Where
dans une requête de suppression.
La seule manière serait de faire une requête select distinct
pour sélectionner toutes les lignes sans doublons, puis les insérer dans une table vide.
Si vous ne disposez pas des enregistrements entièrement en double, la question est formulée de manière incorrecte, et vous ne voulez pas supprimer les doublons, car il n'y en a pas. Les lignes qui ont un ensemble incomplet de champs égaux ne sont pas des doublons. Dans ce cas, vous voudrez supprimer les lignes qui ont des champs égaux, auquel cas vous devrez spécifier ceux à laisser si un certain champ ou jeu de champs n'est pas égal.
Je ne pense pas que ce soit vrai. Supposons que vous sélectionnez tout d'une table, plus une colonne ROW_NUMBER(). Les lignes seront retournées dans l'ordre de l'index clusterisé, et vous obtiendrez une valeur de numéro de ligne différente pour chacun d'eux. Vous pourriez alors l'utiliser pour différencier les doublons dans une clause WHERE. – Yellowfog
row_number est une fonction qui fonctionne avec une instruction order by, qui n'est autorisée que dans une requête select. C'est juste une des raisons pour lesquelles row_number ne peut pas participer directement à une instruction delete. L'une des solutions que j'ai trouvées sur Internet consistait à créer une table séparée, en introduisant row_number comme nouveau champ, puis à exécuter l'instruction delete. Ce n'est pas ce que l'auteur veut. – AlexanderMP
Vous pouvez le faire sans problème en utilisant une expression de table commune (CTE), vous n'avez pas besoin d'utiliser des tables temporaires du tout. Faites juste attention si la suppression va contre une table à trafic élevé. La suppression de grandes quantités de données peut provoquer un blocage et un blocage, le journal de transfert sera également touché.
Remarque: Ce code a été écrit sans test, mais devrait fonctionner (SQL 2005 et versions ultérieures).
/* Create test data with duplicates */
declare @TestTable Table (Col1 int)
insert into @TestTable
select 1 union all
select 1 union all
select 2 union all
select 3 union all
select 3 union all
select 4
;
/* Create CTE to number all duplicates (gives a running number to all identical values in Col1) */
with FindDupes as
(
Select Col1,ROW_NUMBER() over (partition by Col1 order by Col1) RN
from @TestTable
)
/* Delete the duplicates (anything that has a higher rownumber than one) */
Delete from FindDupes where RN>1
;
/* Select the remaining data from the table */
Select * from @TestTable
Je pense que cette requête fonctionne correctement:
delete from table where id in (select count(*)c from table group by id having c > 1)
schéma
- 1. Comment supprimer les enregistrements en double dans une table?
- 2. Supprimer des enregistrements en double dans une table
- 3. DROP TABLE échoue pour la table temporaire
- 4. Comment supprimer les enregistrements de la table?
- 5. Supprimer tous les enregistrements d'une table
- 6. SQL pour supprimer les enregistrements les plus anciens d'une table
- 7. supprimer l'enregistrement en double de la même table dans mysql
- 8. Requête SQL avec des enregistrements en double
- 9. Supprimer les enregistrements en double dans SQL Server?
- 10. Comment supprimer tous les enregistrements d'une table ayant des enregistrements correspondants dans une autre table
- 11. Requête pour supprimer des enregistrements
- 12. Commander les résultats d'une requête à partir d'une table temporaire
- 13. en utilisant une table temporaire avec NHibernate
- 14. Comment éviter d'utiliser une table temporaire pour cette requête simple
- 15. Que dois-je utiliser pour augmenter les performances. Affichage/Requête/Table temporaire
- 16. Ai-je besoin de supprimer l'index sur la table temporaire?
- 17. table temporaire avec les valeurs converties
- 18. Comment supprimer des valeurs en double pour un champ dans une table avec une seule requête?
- 19. Je veux une requête d'insertion pour une table temporaire
- 20. Supprimer les enregistrements d'une table en fonction des données d'une table différente
- 21. SQL: Insérer tous les enregistrements d'une table vers une autre table sans les colonnes spécifiques
- 22. supprimer des enregistrements de la table en utilisant une autre table?
- 23. Comment modifier une table temporaire?
- 24. Expressions de table communes par rapport à la table temporaire
- 25. SQL pour mettre à jour les enregistrements d'une table avec des enregistrements d'une autre table?
- 26. MySQL - Prévenir les enregistrements en double dans la table via l'index?
- 27. Table MySQL myisam, table temporaire et index
- 28. SSMS autorise les enregistrements en double dans une table, mais pas les mises à jour suivantes
- 29. Limite de ressources table temporaire
- 30. regroupement d'enregistrements dans une table temporaire
... s'il vous plaît – JNK
pourquoi ne pas utiliser une table temporaire? ou, 'declare @itemsToRemove table (...)' – tenfour