7

テーブルに重複した行があり、データベースの設計が 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、完全に同一のものは削除する必要があります。これにはどのようなクエリを書くことができますか? 一時テーブルを作成せずに実行できますか? たった 1 つのクエリで?

前もって感謝します :)

4

4 に答える 4

18

これを試してください-テーブルからすべての重複を削除します:

;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
于 2010-07-27T15:51:55.220 に答える
4
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 の方法を使用する方が良いですが、PK を使用している誰かがこの投稿に出くわした場合に備えて、これは残しておきます。

于 2010-07-27T15:40:16.337 に答える
1

私は数週間前にこれをしなければなりませんでした...どのバージョンのSQLServerを使用していますか?SQL Server 2005以降では、選択の一部としてRow_Numberを使用でき、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を確認してください。これにより、正しい方向に進むことができます。

于 2010-07-27T15:44:12.243 に答える
0

最初に次を使用しますSELECT... INTO

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

最初のテーブルをドロップします。

于 2010-07-27T15:37:37.347 に答える