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

时间:2013-08-26 23:23:33

标签: tsql

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

为简化起见,我的TABLE t包含contact_idCode

contact_id           Code
__________           ____
123456                100
123456                200
123456                300
987654                100
987654                200
654321                300

对于每个contact_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子句,但这当然不支持多列。

4 个答案:

答案 0 :(得分:1)

我会保存想要的行(在变量或其他内容中),然后删除整个表,然后将它们重新插入为新行。

答案 1 :(得分:1)

尝试类似:

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

SQL Fiddle with demo

答案 2 :(得分: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

但如果你有一对以上的contact_id + code对每个contact_id会产生超过1行。

答案 3 :(得分:0)

没有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;

小提琴here.