216 votes

T-SQL : Supprimer toutes les lignes en double mais en gardant une

Double Possible:
SQL - Comment puis-je supprimer les doublons de lignes?

J'ai une table avec un très grand nombre de lignes. Les doublons ne sont pas autorisés, mais en raison d'un problème avec la façon dont les lignes ont été créées, je sais qu'il y a des doublons dans ce tableau. J'ai besoin d'éliminer les lignes supplémentaires du point de vue des colonnes de clé. D'autres colonnes peuvent avoir légèrement différentes données, mais je ne m'inquiète pas à ce sujet. J'ai encore besoin de garder l'un de ces lignes. SELECT DISTINCT ne fonctionne pas parce qu'il fonctionne sur toutes les colonnes, et j'ai besoin de supprimer les doublons sur la base des colonnes.

Comment puis-je supprimer les lignes supplémentaires, mais toujours garder une manière efficace?

447voto

Ben Thul Points 7319

Vous n'avez pas dit quelle version vous utilisez, mais dans SQL 2005 et au-dessus, vous pouvez utiliser une expression de table commune avec la Clause OVER. Il va quelque chose comme ceci:

WITH cte AS (
  SELECT[foo], [bar], 
     row_number() OVER(PARTITION BY foo, bar ORDER BY baz) AS [rn]
  FROM TABLE
)
DELETE cte WHERE [rn] > 1

Jouer avec elle et voir ce que vous obtenez.

(Edit: Dans une tentative pour être utile, quelqu'un a édité le ORDER BY clause dans les CTE. Pour être clair, vous pouvez commander par tout ce que vous voulez ici, il n'a pas besoin d'être l'une des colonnes retournées par le cte. En fait, une commune de cas d'utilisation, ici, est que "foo bar" sont l'identificateur de groupe et de "baz" est une sorte d'horodatage. Afin de conserver la plus récente, vous feriez ORDER BY baz desc)

89voto

jams Points 7774
<p>Exemple de requête :<pre><code></code></pre><p>Ici <code></code> sont la colonne sur laquelle vous souhaitez regrouper les lignes en double.</p></p>

21voto

Cory Points 37551
<p>Voici mon twist là-dessus...<pre><code></code></pre><p>Ne sais pas pourquoi c’est ce que je pensais de première... certainement pas la plus simple à faire, mais ça marche.</p></p>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by: