Sql 查找和删除表中允许记录多次出现的重复行
我有一个需要删除重复项的表。但是,该表的设计使每个客户都可以拥有相同的项目。下面是一个屏幕截图,例如: 当我尝试删除副本时,我还得到了两个客户的相同图书编号。 绿色区域显示实际副本,而蓝色区域显示不重复的书籍,因为客户可以借用相同的书籍 如何仅在每个客户的行相同的情况下删除?所以绿色区域 这是我的代码:如果两位客户的书号相同,则此代码无效Sql 查找和删除表中允许记录多次出现的重复行,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有一个需要删除重复项的表。但是,该表的设计使每个客户都可以拥有相同的项目。下面是一个屏幕截图,例如: 当我尝试删除副本时,我还得到了两个客户的相同图书编号。 绿色区域显示实际副本,而蓝色区域显示不重复的书籍,因为客户可以借用相同的书籍 如何仅在每个客户的行相同的情况下删除?所以绿色区域 这是我的代码:如果两位客户的书号相同,则此代码无效 WITH CTE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY BookNumber ORDER BY
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
下面的查询应该为您提供一个带有customerID的所有重复bookNumber的列表,您只需执行一个简单的delete语句,其结果就是删除重复记录
SELECT count(bookNumber), booknumber, customerID FROM TableName GROUP BY booknumber, customerID having count(booknumber)> 1
我应该提到,按书号desc排序是不必要的,因此我删除了“desc”部分,这是查找重复数据的方法之一,请尝试=) 或者下面的替代方法
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
非常感谢你!我想我就快到了。
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