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

Как да изтрия дублиращи се редове в SQL Server 2008?

Най-простият начин е с CTE (общ табличен израз). Използвам този метод, когато имам необработени данни за импортиране; първото нещо, което правя, за да го дезинфекцирам, е да се уверя, че няма дубликати --- че имам някакъв уникален манипулатор за всеки ред.

Резюме:

WITH numbered AS (
    SELECT ROW_NUMBER() OVER(PARTITION BY [dupe-column-list] ORDER BY [dupe-column-list]) AS _dupe_num FROM [table-name] WHERE 1=1
)
DELETE FROM numbered WHERE _dupe_num > 1;

Частта "dupe-column-list" е мястото, където изброявате всички включени колони, където желаете стойностите да са уникални. ORDER BY е мястото, където вие решавате, в рамките на набор от дубликати, кой ред "печели" и кой да бъде изтрит. ("WHERE 1=1" е просто личен навик.)

Причината да работи е, че Sql Server поддържа вътрешна, уникална препратка към всеки ред източник, който е избран в CTE. Така че, когато се изпълни DELETE, той знае точния ред за изтриване, независимо какво сте поставили в списъка за избор на вашия CTE. (Ако сте нервни, можете да промените „DELETE“ на „SELECT *“, но тъй като имате дублиращи се редове, това няма да помогне; ако можехте уникално да идентифицирате всеки ред, нямаше да четете това .)

Пример:

CREATE TABLE ##_dupes (col1 int, col2 int, col3 varchar(50));
INSERT INTO ##_dupes 
    VALUES (1, 1, 'one,one')
        , (2, 2, 'two,two')
        , (3, 3, 'three,three')
        , (1, 1, 'one,one')
        , (1, 2, 'one,two')
        , (3, 3, 'three,three')
        , (1, 1, 'one,one')
        , (1, 2, '1,2');

От 8-те реда имате 5 замесени с дублиращи се проблеми; 3 реда трябва да бъдат премахнати. Можете да видите проблемите с това:

SELECT col1
    , col2
    , col3
    , COUNT(1) AS _total 
    FROM ##_dupes 
    WHERE 1=1 
    GROUP BY col1, col2, col3
    HAVING COUNT(1) > 1
    ORDER BY _total DESC;

Сега изпълнете следната заявка, за да премахнете дубликатите, оставяйки 1 ред от всеки набор от дубликати.

WITH numbered AS (
    SELECT ROW_NUMBER() OVER(PARTITION BY col1, col2, col3 ORDER BY col1, col2, col3) AS _dupe_num FROM ##_dupes WHERE 1=1
)
DELETE FROM numbered WHERE _dupe_num > 1;

Сега ви остават 5 реда, нито един от които не се дублира.



  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 за генериране на XML на таблични данни

  2. Как да зададете цвета на лентата на състоянието в SSMS за различни екземпляри на SQL сървър - SQL Server / TSQL урок, част 6

  3. Неуспешна SSIS задача, когато маската за избор на файлове за качване на FTP сървър с помощта на WinSCP не съвпада с никакви файлове

  4. SQL Персонализирано търсене със специални знаци

  5. Как мога да комбинирам няколко реда в списък, разделен със запетая в SQL Server 2005?