Tsql 删除除(我的查询)之外的所有行

Tsql 删除除(我的查询)之外的所有行,tsql,Tsql,我花了一点时间寻找这种情况,发现很多都很接近,但我无法让它与我的情况一起工作 为了简化,我有带有联系人id和代码的表t 对于每个联系人id,我要选择代码最高的行,并删除其他行。我确实提出了一个select语句来显示我希望表格的外观: select distinct contact_id, MAX(code) OVER(Partition by contact_id) AS code from t 基于上述情况,我的结果集为: 123456 300 987654

我花了一点时间寻找这种情况,发现很多都很接近,但我无法让它与我的情况一起工作

为了简化,我有带有联系人id和代码的表t

对于每个联系人id,我要选择代码最高的行,并删除其他行。我确实提出了一个select语句来显示我希望表格的外观:

select distinct contact_id, MAX(code) OVER(Partition by contact_id) AS code
from t
基于上述情况,我的结果集为:

123456                300
987654                200
654321                300

如何删除除此select语句生成的行以外的所有行。我尝试使用NOT IN子句,但这当然不支持多列。

我会将所需的行保存在变量或其他内容中,然后删除整个表,然后将其作为新行重新插入。

尝试以下操作:

with cte as
(
  select *
    , rownum = row_number() over (partition by contact_id order by code desc)
  from t
)
delete cte
where rownum <> 1
.

试试这个:

DELETE atable
FROM atable at
INNER JOIN (    
   SELECT contact_id, code = MAX(code)
   FROM atable
   GROUP BY contact_id
) q ON at.contact_id = q.contact_id AND at.code < q.code

但是,如果您有多行联系人id+代码对,则每个联系人id+代码将生成多行。

没有CTE或子查询:

DELETE t1 FROM t t1
LEFT OUTER JOIN t t2
ON t1.contact_id = t2.contact_id AND t1.code < t2.code
WHERE t2.code IS NOT NULL;

小提琴非常简单。谢谢,不客气!如果一个答案有助于解决你的问题,请考虑将其设置为被接受。只是一个想法,人们,没有必要恨我。此外,为什么人们必须对帖子进行如此微小、不必要的编辑?真烦人。在某些情况下,作为一次性批处理作业、大表和小剩余数据集,这可能是最有效的解决方案。
DELETE t1 FROM t t1
LEFT OUTER JOIN t t2
ON t1.contact_id = t2.contact_id AND t1.code < t2.code
WHERE t2.code IS NOT NULL;