Как удалить абсолютно дублирующиеся строки

Скажите, что у меня есть дублирующиеся строки в моей таблице, и хорошо мое проектирование баз данных имеет 3-й класс:-

Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (1,'Cinthol','cosmetic soap','soap');
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (1,'Cinthol','cosmetic soap','soap');
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (1,'Cinthol','cosmetic soap','soap');
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (1,'Lux','cosmetic soap','soap');
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (1,'Crowning Glory','cosmetic soap','soap');
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (2,'Cinthol','nice soap','soap');
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (3,'Lux','nice soap','soap');
Insert Into tblProduct (ProductId,ProductName,Description,Category) Values (3,'Lux','nice soap','soap');

Я хочу только 1 экземпляр каждой строки, должен присутствовать в моей таблице. Таким образом 2nd, 3rd and last row то, которые абсолютно идентичны, должно быть удалено. Какой запрос я могу записать для этого? Это может быть сделано, не составляя временные таблицы? Только в одном едином запросе?

Заранее спасибо :)

7
задан OMG Ponies 27 July 2010 в 15:44
поделиться

4 ответа

Попробуйте это - он удалит все дубликаты из вашей таблицы:

;WITH duplicates AS
(
    SELECT 
       ProductID, ProductName, Description, Category,
       ROW_NUMBER() OVER (PARTITION BY ProductID, ProductName
                          ORDER BY ProductID) 'RowNum'
    FROM dbo.tblProduct
)
DELETE FROM duplicates
WHERE RowNum > 1
GO

SELECT * FROM dbo.tblProduct
GO

Ваши дубликаты должны исчезнуть: вывод:

ProductID   ProductName   DESCRIPTION        Category
   1          Cinthol         cosmetic soap      soap
   1          Lux             cosmetic soap      soap
   1          Crowning Glory  cosmetic soap      soap
   2          Cinthol         nice soap          soap
   3          Lux             nice soap          soap
18
ответ дан 6 December 2019 в 07:49
поделиться

Мне пришлось сделать это несколько недель назад... какую версию SQL Server вы используете? В SQL Server 2005 и выше, вы можете использовать Row_Number как часть вашего select, и только select, где Row_Number равен 1. Я забыл точный синтаксис, но он хорошо документирован... что-то вроде:

Select t0.ProductID, 
       t0.ProductName, 
       t0.Description, 
       t0.Category
Into   tblCleanData
From   (
    Select ProductID, 
           ProductName, 
           Description, 
           Category, 
           Row_Number() Over (
               Partition By ProductID, 
                            ProductName, 
                            Description, 
                            Category
               Order By     ProductID,
                            ProductName,
                            Description,
                            Category
           ) As RowNumber
    From   MyTable
) As t0
Where t0.RowNumber = 1

Посмотрите http://msdn.microsoft.com/en-us/library/ms186734.aspx, это должно помочь вам двигаться в правильном направлении.

1
ответ дан 6 December 2019 в 07:49
поделиться
DELETE tblProduct 
FROM tblProduct 
LEFT OUTER JOIN (
   SELECT MIN(ProductId) as ProductId, ProductName, Description, Category
   FROM tblProduct 
   GROUP BY ProductName, Description, Category
) as KeepRows ON
   tblProduct.ProductId= KeepRows.ProductId
WHERE
   KeepRows.ProductId IS NULL

Украдено с Как удалить повторяющиеся строки?

ОБНОВЛЕНИЕ:

Это будет работать, только если ProductId является первичным ключом (а это не так). Вам лучше использовать метод @marc_s, но я оставлю это на тот случай, если кто-то, использующий ПК, наткнется на этот пост.

4
ответ дан 6 December 2019 в 07:49
поделиться

Сначала используйте SELECT ... INTO :

SELECT DISTINCT ProductID, ProductName, Description, Category
    INTO tblProductClean
    FROM tblProduct

Удалить первую таблицу.

0
ответ дан 6 December 2019 в 07:49
поделиться
Другие вопросы по тегам:

Похожие вопросы: