2

重複を削除する必要があるテーブルがあります。ただし、テーブルは各顧客が同じアイテムを持つことができるように設計されています。たとえば、スクリーンショットを次に示します。

ここに画像の説明を入力

重複を削除しようとすると、両方の顧客に同じ書籍番号も表示されます。緑色の領域は実際の複製を示していますが、青色の領域は顧客が同じ本を借りることができるため、複製されていない本を示しています。

各顧客の行が同じところだけを削除するにはどうすればよいですか? というわけで緑地。

これが私のコードです:両方の顧客が同じ Book 番号を持っている場合、機能しません。

WITH CTE AS
(
SELECT  *, 
ROW_NUMBER() OVER (PARTITION BY BookNumber ORDER BY BookNumber DESC) AS DUPS
FROM Store.Books 
)

SELECT * FROM CTE WHERE DUPS > 1
4

3 に答える 3

1
WITH CTE AS
(
SELECT  *, 
ROW_NUMBER() OVER (PARTITION BY BookNumber, Customerid ORDER BY BookNumber) AS DUPS
FROM Store.Books 
)
SELECT * FROM CTE WHERE DUPS > 1
-- if you want to delete, replace last line with this:
--DELETE FROM CTE WHERE DUPS > 1

booknumber desc による順序は必要ないので、'desc' の部分を削除しました。

于 2013-08-16T07:43:45.897 に答える
0

兄弟、これは重複データを見つける方法の 1 つです。試してみてください =)

DECLARE @tempTable TABLE(
CustomerID SMALLINT,
BookLoan NVARCHAR(255),
BookNumber INT,
BookAuthor NVARCHAR(255)
)

INSERT INTO @tempTable Values(112,'Clash Of Titans',12345,'Dick VanDyke ')
INSERT INTO @tempTable Values(112,'Clash Of Titans',12345,'Dick VanDyke ')
INSERT INTO @tempTable Values(112,'Clash Of Titans',23457,'Dick VanDyke ')
INSERT INTO @tempTable Values(112,'History of Soda',99899,'Brian Adams  ')

Select *,Count(*) 'Occurrance' From @tempTable Group by 
CustomerID,BookLoan,BookNumber,BookAuthor having count(*) > 1


Delete from @temptable
where CustomerID = (Select customerID From @tempTable Group by
CustomerID,BookLoan,BookNumber,BookAuthor having count(*) > 1)
AND BookLoan = (Select BookLoan From @tempTable Group by 
CustomerID,BookLoan,BookNumber,BookAuthor having count(*) > 1)
AND BookNumber = (Select BookNumber From @tempTable Group by 
CustomerID,BookLoan,BookNumber,BookAuthor having count(*) > 1)
AND BookAuthor = (Select BookAuthor From @tempTable Group by 
CustomerID,BookLoan,BookNumber,BookAuthor having count(*) > 1)

Select * from @tempTable

または、以下の代替方法はこちら

DECLARE @tempTable TABLE(
CustomerID SMALLINT,
BookLoan NVARCHAR(255),
BookNumber INT,
BookAuthor NVARCHAR(255)
)

INSERT INTO @tempTable Values(112,'Clash Of Titans',12345,'Dick VanDyke ')
INSERT INTO @tempTable Values(112,'Clash Of Titans',12345,'Dick VanDyke ')
INSERT INTO @tempTable Values(112,'Clash Of Titans',23457,'Dick VanDyke ')
INSERT INTO @tempTable Values(112,'History of Soda',12345,'Brian Adams  ')

;WITH CTE AS
(
SELECT  *, 
ROW_NUMBER() OVER (PARTITION BY CustomerID, BookLoan,BookNumber,BookAuthor 
ORDER BY BookNumber) AS DUPS
FROM @tempTable
)
DELETE FROM @tempTable
WHERE CustomerID = (SELECT CustomerID FROM CTE WHERE DUPS > 1)
AND BookLoan = (SELECT BookLoan FROM CTE WHERE DUPS > 1)
AND BookNumber = (SELECT BookNumber FROM CTE WHERE DUPS > 1)
AND BookAuthor = (SELECT BookAuthor FROM CTE WHERE DUPS > 1)

SELECT * FROM @tempTable
于 2013-08-16T09:02:43.357 に答える