主表结构:ID和Name两个字段,ID为主键
从表结构:ID、pName、tvID,tvID是主表外键,ID是主键,
现在主表中的Name字段有重复,想删除主表中的多余数据,只保留Name重复中ID最小的那条数据即可,但是又不能使从表中的数据丢失,我的思路是先将相应的TVID修改为主表中Name字段重复数据的ID最小值,然后再删除多余的重复数据,怎么写这条SQL语句?

解决方案 »

  1.   

    update a set tvid=(select min(id) from tb1 where name=b.name)
     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))
      

  2.   

    主表数据
    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是外键,所以要继续跟主表的主键关联起来,不能使数据丢失
      

  3.   

    设置外键关系为null,直接删除。后面再把从表数据更新一下
      

  4.   


    我整得有点乱
    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
      

  5.   


    第二个写错了
    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)