一个复杂的delete语句 涉及4个表a(aid, bid)  adi是主键,bid在这里是外键可重复
b(bid)     bid是主键
c(cid,bid) cid是主键,bid在这里是外键可重复
d (did,cid)did是主键,  d的父亲是c 
现在是根据在a重复的bid,来删除d的所有重复的bid相关记录这里可以抛开b表, 直接在a c d里写sql。
我的写法
delete frome d where cid in (
select cid from c where bid in 
(
select bid from a group by bid having count(*)>=2
))大家知道mysql的嵌套语句执行得不是很好,这里寻求有没有更好的写饭

解决方案 »

  1.   

    delete d inner join c on d.cid=c.cid
    inner join
    (select bid from a group by bid having count(*)>=2) b
    on c.bid=b.bid
      

  2.   


    顶一个,用not exists估计效率也高不过这个,所以不写了
      

  3.   

    感谢楼上
    我也写出 
    只是想深入明白 为什么在mysql里
    inner join 要远远好过 select  where id in (select ....)
      

  4.   


     看一下这个贴子中的讨论。
    http://topic.csdn.net/u/20090626/16/65f043cf-b9d9-4707-b660-9857461177f4.html
      

  5.   

    delete User a inner join (select id from Use rwhere name in ('opdfsdf11','sdfspd','xisdfsdfob2','xdfsd33'))  b on a.id=b.id执行发现编译都无法通过
    delete 换成select × from 马上通过这里质疑
    delete d inner join c on d.cid=c.cid 
    inner join 
    (select bid from a group by bid having count(*)>=2) b 
    on c.bid=b.bid 是否能编译通过??
      

  6.   

    DELETE d FROM d INNER JOIN c ON d.cid=c.cid 
    INNER JOIN 
    (SELECT bid FROM a GROUP BY bid HAVING COUNT(*)>=2) b 
    ON c.bid=b.bid
      

  7.   

    delete User from User  inner join (select id from Use rwhere name in ('opdfsdf11','sdfspd','xisdfsdfob2','xdfsd33'))  b on User.id=b.id 
    可见mysql有很多自己的表达方式在delete里面是不能随便使用别名的。  
      

  8.   

    可以用别名。当然加上个“随便”之后就危险了。delete a from table1 a, table2 b where a.id=b.id and b.dol>10;