Sql 删除特定的重复记录

Sql 删除特定的重复记录,sql,sql-server,database,sql-server-2008,tsql,Sql,Sql Server,Database,Sql Server 2008,Tsql,我正在尝试删除不包含特定状态的重复记录 这是我的密码: DELETE FROM [dbo].[test] WHERE ID NOT IN ( SELECT MAX(ID) FROM [dbo].[test] GROUP BY [UserID] ) AND Status <> 'D' 我需要删除除包含状态“D”的记录之外的所有重复记录。它给我的错误是语法不正确 最终的问题是我从两个表中插入数据。一个表S

我正在尝试删除不包含特定状态的重复记录

这是我的密码:

DELETE FROM [dbo].[test] 
WHERE ID NOT IN ( SELECT MAX(ID) 
                  FROM [dbo].[test] 
                  GROUP BY [UserID] ) 
AND Status <> 'D' 
我需要删除除包含状态“D”的记录之外的所有重复记录。它给我的错误是语法不正确

最终的问题是我从两个表中插入数据。一个表Support插入需要更新主表Data的信息。另一个表Identity为主表提供用户数据库。如果支持表中的状态为“D”表示禁用,则我需要在主表中保留这两条记录

你是这个意思吗

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

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

你的语法看起来不错。以下是另一种方法:

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';

您的问题涉及不同的表,但此查询只涉及一个表。我可以理解“未找到列”错误,但您的语法看起来正常。

您的语法看起来正常。以下是另一种方法:

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';

您的问题涉及不同的表,但此查询只涉及一个表。我可以理解一个列“未找到”错误,但您的语法看起来正常。

为什么条件和状态“D”在括号外?不断出现语法错误。请尝试我的和@GordonLinoff解决方案。这样就成功了。谢谢你接受我的回答。我看你没有改变顺序来解决这个问题。该查询看起来有效。也许你有一个“时髦的”。它说错误在哪里。为什么条件和状态“D”在括号外?不断出现语法错误。试试我的和@GordonLinoff解决方案。这样就成功了。谢谢你接受我的回答。我看你没有改变顺序来解决这个问题。该查询看起来有效。也许你有一个“时髦的”。它说错误在哪里。出于好奇,除了顺序之外,你的查询和OP查询有什么区别?@bjones说实话,我只是把条件移到了上面。我现在没有任何东西要测试,所以我真的不确定它是否会工作,或者两个查询是否工作相同。这就是为什么我问有什么区别。我不知道你的问题对接受它作为答案有什么影响。就像狗仔队所说的,可能是“放错地方了”。@bjones是的,可能是我很幸运:出于好奇,除了订单之外,你的查询和OP查询有什么区别?@bjones说实话,我只是把条件移到了最上面。我现在没有任何东西要测试,所以我真的不确定它是否会工作,或者两个查询是否工作相同。这就是为什么我问有什么区别。我不知道你的问题对接受它作为答案有什么影响。就像狗仔队说的,也许这是一个放错地方了。@bjones是的,也许我很幸运: