Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 查找和删除表中允许记录多次出现的重复行_Sql_Sql Server_Tsql - Fatal编程技术网

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