我有一个主表tbl_user
和一个临时表tbl_user_temp
。
tbl_user
包含一些重复的记录,因此我使用此查询将这些记录移动到临时表中:
INSERT INTO tbl_user_temp
SELECT
*
FROM
tbl_user
GROUP BY
fullname, username, password
HAVING
COUNT(*) > 1
现在我要做的是删除tbl_user
中存在的tbl_user_temp
我正在使用SQL Server 2008 R2。
答案 0 :(得分:2)
我猜您要删除主表中的所有重复记录。 此解决方案允许您从每组重复项中删除一行(而不是一次只处理一个重复项块):
;WITH x AS
(
SELECT username, rn = ROW_NUMBER() OVER (PARTITION BY
fullname,username,password
ORDER BY username)
FROM dbo.tbl_user
)
DELETE x WHERE rn > 1;
Row_Number()将生成分区明智的行号。对于每个相同的组,行号将在那里。
在DELETE x WHERE rn > 1;
那里,它将检查rownumber是否大于1它将删除该行。如果您仅使用Select
代替delete
查询,您将看到它如何生成rownumber。
答案 1 :(得分:1)
无需临时表:
delete u
from (
select row_number() over (
partition by fullname, username, password
order by newid()) as rn
from tbl_user
) u
where rn > 1