Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

SQL Server 2008:изтриване на дублирани редове

Можете да DELETE от cte:

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1

ROW_NUMBER() функцията присвоява номер на всеки ред. PARTITION BY се използва за започване на номерирането отначало за всеки елемент в тази група, в този случай всяка стойност на uniqueid ще започне номерирането от 1 и ще продължи оттам нагоре. ORDER BY определя в кой ред влизат числата. Тъй като всеки uniqueid се номерира, започвайки от 1, всеки запис с ROW_NUMBER() по-голямо от 1 има дублиран uniqueid

За да разберете как ROW_NUMBER() функцията работи, просто я изпробвайте:

SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid ORDER BY col2)'RowRank'
FROM Table
ORDER BY uniqueid

Можете да коригирате логиката на ROW_NUMBER() функция, за да коригирате кой запис ще запазите или премахнете.

Например, може би бихте искали да направите това на няколко стъпки, като първо изтриете записи със същото фамилно име, но различни собствени имена, можете да добавите фамилно име към PARTITION BY :

WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY uniqueid, col3 ORDER BY col2)'RowRank'
             FROM Table)
DELETE FROM cte 
WHERE RowRank > 1


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Индекси на SQL Server:Ключови изисквания, въздействие върху производителността и съображения

  2. Управлявайте паралелността на транзакциите с помощта на заключвания в SQL Server

  3. Използване на курсор в dbMail в sql сървър 2008

  4. Как се съхраняват стойностите на varchar в база данни на SQL Server?

  5. Внедряване на проект за база данни VS2010 - задачата SqlDeployTask се провали неочаквано, NullReferenceException