Как устранить дубликаты строк в таблице базы данных SQL Server 2005? - PullRequest
1 голос
/ 26 ноября 2010

Я использую SQL Server 2005. У меня есть таблица содержит дублированные строки.Как я могу удалить эти дубликаты строк в этой таблице?например, таблица может содержать 3 одинаковые строки, в которых я хочу удалить 2 строки и сохранить оригинал

Ответы [ 3 ]

1 голос
/ 26 ноября 2010

Если вы просто хотите удалить дубликаты записей из набора результатов, вы можете использовать команду DISTINCT:

SELECT DISTINCTI field1, field2 FROM...

Если вы хотите удалить эти дубликаты записей, вы можете использовать COUNT, чтобы определить, какие записи имеютболее одного экземпляра, а затем удаляя их с помощью подзапроса

0 голосов
/ 26 ноября 2010

Для понимания давайте возьмем простую таблицу Employee с приведенной ниже схемой

EmployeeId - int
EmployeeName    varchar(50)
Age int

Позволяет заполнить дублирующиеся значения.Обратите внимание, что первичный ключ не дублируется в этом случае

INSERT INTO Employee(EmployeeId,EmployeeName,Age) VALUES (1,'Mark',20)
INSERT INTO Employee(EmployeeId,EmployeeName,Age) VALUES (2,'Tom',22)
INSERT INTO Employee(EmployeeId,EmployeeName,Age) VALUES (3,'Sam',24)
INSERT INTO Employee(EmployeeId,EmployeeName,Age) VALUES (4,'Mark',20)
INSERT INTO Employee(EmployeeId,EmployeeName,Age) VALUES (5,'Tom',22)
INSERT INTO Employee(EmployeeId,EmployeeName,Age) VALUES (6,'Tom',22)
GO 

, мы можем использовать CTE для поиска дублирующихся строк.Соберите повторяющиеся строки с помощью оператора Group by / Count.Как только дублирующиеся строки идентифицированы, мы выбираем эти строки из основной таблицы, используя условие соединения.Теперь оцените эти строки и удалите все строки, кроме строк с рангом 1. Я считаю это намного более элегантным.

WITH TotalDuplicates(EmployeeName,Age,Total) AS 
(
    SELECT EmployeeName,Age,COUNT(employeeId)  AS Total  FROM Employee 
    GROUP BY EmployeeName,Age
    HAVING COUNT(employeeId) > 1
)
,DistinctRows(EmployeeId,EmployeeName,Age) AS 
(
    SELECT E.EmployeeId,E.EmployeeName,E.Age FROM Employee AS E
    INNER JOIN TotalDuplicates AS D 
    ON (E.EmployeeName = D.EmployeeName AND E.Age = D.Age)
)
,OrderedDuplicateTables(EmployeeId,EmployeeName,Age,Ranking) AS 
(
    SELECT 
        EmployeeId,
        EmployeeName,
        Age,
        RANK() OVER (PARTITION BY EmployeeName, Age ORDER BY EmployeeId DESC) 
    FROM DistinctRows 
)

DELETE FROM Employee
WHERE EmployeeId IN (SELECT EmployeeId FROM OrderedDuplicateTables WHERE Ranking > 1)
0 голосов
/ 26 ноября 2010

Сначала вы можете скопировать дубликат записи в другую таблицу, как показано ниже

Select fieldnames into #temp from table1 group by fieldnames having count (*) > 1

затем удалите эту запись из исходной таблицы

delete from table1 where fieldname in (select fieldnames from #temp)

и, наконец, скопировать запись из временной таблицы в исходную таблицу.

insert table1 select * from #temp

с помощью вышеупомянутых шагов вы можете удалить дубликат записи из таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...