SQL Server 2008 R2:选择另一个表中存在的记录

时间:2015-02-26 06:16:37

标签: sql-server sql-server-2008-r2

我有一个主表tbl_user和一个临时表tbl_user_temptbl_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。

2 个答案:

答案 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

Example at SQL Fiddle.