sql >> Database teknologi >  >> RDS >> Sqlserver

T-SQL:Sletter alle duplikerede rækker, men beholder én

Du sagde ikke hvilken version du brugte, men i SQL 2005 og nyere kan du bruge et almindeligt tabeludtryk med OVER-klausulen. Det lyder lidt sådan her:

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

Leg med det og se, hvad du får.

(Rediger:I et forsøg på at være hjælpsom, redigerede nogen ORDER BY klausul i CTE. For at være klar, kan du bestille efter hvad som helst her, det behøver ikke at være en af ​​kolonnerne, der returneres af cte. Faktisk er en almindelig anvendelse her, at "foo, bar" er gruppe-id'en, og "baz" er en slags tidsstempel. For at beholde det seneste, skal du gøre ORDER BY baz desc )



  1. Hvad er nyt i MariaDB 10.4

  2. Sammenligning af virtuelle cloud-maskiner med administreret cloud-database

  3. Vis alle forespørgsler, der kommer til en Oracle-database

  4. Hvordan spooler jeg til en CSV-formateret fil ved hjælp af SQLPLUS?