主表结构:ID和Name两个字段,ID为主键
从表结构:ID、pName、tvID,tvID是主表外键,ID是主键,
现在主表中的Name字段有重复,想删除主表中的多余数据,只保留Name重复中ID最小的那条数据即可,但是又不能使从表中的数据丢失,我的思路是先将相应的TVID修改为主表中Name字段重复数据的ID最小值,然后再删除多余的重复数据,怎么写这条SQL语句?
从表结构:ID、pName、tvID,tvID是主表外键,ID是主键,
现在主表中的Name字段有重复,想删除主表中的多余数据,只保留Name重复中ID最小的那条数据即可,但是又不能使从表中的数据丢失,我的思路是先将相应的TVID修改为主表中Name字段重复数据的ID最小值,然后再删除多余的重复数据,怎么写这条SQL语句?
from tb2 a
left join tb1 b on a.tvid=b.iddelete tb1 where id in (select id from tb group by name having count(1)>1 and id <> min(id))
ID Name
31 广西卫视
33 广西卫视
35 广西卫视
37 广西卫视
38 广西卫视
39 广西卫视
44 江苏卫视
45 江苏卫视
46 江苏卫视
48 江苏卫视
从表数据
ID tvid PName
31 31 广西报道
33 33 新闻夜总汇
35 35 午间新闻
37 37 一周新闻综述
38 38 壮语新闻
39 39 资讯晨报
44 44 晚间新闻
45 45 时代风范
46 46 东线长城
48 48 廉政时空我希望的结果:主表中保留ID为31和44,其余删除,但是tvid是外键,所以要继续跟主表的主键关联起来,不能使数据丢失
我整得有点乱
update t2 set tvId=v.t1id
from
t2 u
join
(
select x.id,x.tvId,y.id as t1id
from
(select t1.name,t2.tvId,t2.id from t1 join t2 on t1.id=t2.tvId)
x
join
(
select MIN(t1.id) as id,t1.name
from t2 join t1 on t2.tvId =t1.id
group by t1.name
) y on x.name=y.name
) v on u.id=v.id
第二个写错了
delete a from tb1 a
where a.name in (select name from tb1 group by name having count(1)>1)
and a.id not in(select min(id) from tb1 group by name)