2016-06-07 176 views
1

我想删除不包含特定状态的重复记录。删除特定的重复记录

这里是我的代码:

DELETE FROM [dbo].[test] 
WHERE ID NOT IN (SELECT MAX(ID) 
        FROM [dbo].[test] 
        GROUP BY [UserID]) 
AND Status <> 'D' 

我需要删除除了包含状态“d”记录所有重复的记录。它给我的错误是语法错误。

最终的问题是我插入两个表中的数据。一个表,支持,插入需要更新主表,数据的信息。另一张表,Identity提供主表的用户数据库。如果支持表的状态为Disable,则需要将这两个记录保留在主表中。

+0

为什么条件“和状态<>'D'”括号外? – DevelopmentIsMyPassion

+0

保持获取语法错误。 –

+0

试试我的和@GordonLinoff解决方案。 – DevelopmentIsMyPassion

回答

0

你的意思是?

DELETE FROM [dbo].[test] 
WHERE Status <> 'D' AND ID NOT IN ( 
SELECT MAX(ID) 
FROM [dbo].[test] 
GROUP BY [UserID]) 
+0

出于好奇,你和OP查询之间的区别是什么? – BJones

+0

@bjones是非常诚实的,我只是把条件放在首位。我没有任何东西要测试,所以真的不知道它是否可以工作 – DevelopmentIsMyPassion

+0

这两个查询的工作原理都是一样的。这就是我问为什么会有所不同的原因。我不知道你的查询作为答案接受它有什么不同。像狗仔队说,也许这是一个错位的地方。 – BJones

0

您的语法看起来不错。这里是一种替代方法:

with todelete as (
     select t.*, max(id) over (partition by userid) as maxid 
     from dbo.test 
    ) 
delete from todelete 
    where id < maxid and status <> 'D'; 

你的问题提到了不同的表,但是这个查询只提到了一个表。我可以理解“找不到列”错误,但是您的语法看起来不错。