Скажите, что у меня есть дублирующиеся строки в моей таблице, и хорошо мое проектирование баз данных имеет 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
то, которые абсолютно идентичны, должно быть удалено. Какой запрос я могу записать для этого? Это может быть сделано, не составляя временные таблицы? Только в одном едином запросе?
Заранее спасибо :)
Попробуйте это - он удалит все дубликаты из вашей таблицы:
;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
Мне пришлось сделать это несколько недель назад... какую версию 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, это должно помочь вам двигаться в правильном направлении.
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, но я оставлю это на тот случай, если кто-то, использующий ПК, наткнется на этот пост.
Сначала используйте SELECT ... INTO
:
SELECT DISTINCT ProductID, ProductName, Description, Category
INTO tblProductClean
FROM tblProduct
Удалить первую таблицу.