如何删除相同邮政编码的多个记录,保留数据库表中该邮政编码的至少一条记录

时间:2010-11-29 09:48:55

标签: sql database sql-server-2005

如何删除同一个zipcode的多个记录,保留数据库表中该zipcode的至少一条记录


id zipcode
1  38000 
2  38000 
3  38000 
4  38005
5  38005

我想要带有id和zipcode两列的表格... 我的决赛将关注


id zipcode
1  38000 
4  38005

6 个答案:

答案 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