如何删除同一个zipcode的多个记录,保留数据库表中该zipcode的至少一条记录
id zipcode
1 38000
2 38000
3 38000
4 38005
5 38005
我想要带有id和zipcode两列的表格... 我的决赛将关注
id zipcode
1 38000
4 38005
答案 0 :(得分:6)
怎么样
delete from myTable
where id not in (
select Min( id )
from myTable
group by zipcode )
这可以让你保留最低的ID,这就是你想要的。
答案 1 :(得分:1)
要选择该结果集,您将使用DISTINCT语句:
SELECT id, zipcode
FROM table
WHERE zipcode IN (SELECT DISTINCT zipcode FROM table)
要删除其他记录并只保留一个,请使用子查询,如下所示:
DELETE FROM table
WHERE id NOT IN
(SELECT id
FROM table
WHERE zipcode IN (SELECT DISTINCT zipcode FROM table)
)
如果您愿意,也可以使用联接完成此操作。
答案 2 :(得分:1)
with cte as (
select row_number() over (partitioned by zipcode order by id desc) as rn
from table)
delete from cte
where rn > 1;
这样做的好处是可以正确处理重复项,并提供对删除内容和保留内容的严格控制。
答案 3 :(得分:0)
创建具有所需结果的临时表:
select min(id), zipcode
into tmp_sometable
from sometable
group by zipcode
删除原始表:
drop table sometable
重命名临时表:
sp_rename 'tmp_sometable', 'sometable';
或类似的东西:
delete from sometable
where id not in
(
select min(id)
from sometable
group by zipcode
)
答案 4 :(得分:0)
从id不在的表中删除(从表zipcode中选择min(id)(从表中选择不同的zipcode));
从表格中选择不同的邮政编码 - 会在表格中给出明确的邮政编码 从表zipcode中选择min(id)(从表中选择不同的zipcode) - 将为每个邮政编码提供带有最小ID的记录 从id不在的表中删除(从表zipcode中选择min(id)(从表中选择不同的zipcode)) - 这将删除表中由于查询2而不存在的所有记录
答案 5 :(得分:0)
如果您想要最低的ID号,可以使用更简单的方法。我刚试过这个:
SELECT
min(ID),
zipcode
FROM #zip
GROUP BY zipcode