一个复杂的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的嵌套语句执行得不是很好,这里寻求有没有更好的写饭
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的嵌套语句执行得不是很好,这里寻求有没有更好的写饭
inner join
(select bid from a group by bid having count(*)>=2) b
on c.bid=b.bid
顶一个,用not exists估计效率也高不过这个,所以不写了
我也写出
只是想深入明白 为什么在mysql里
inner join 要远远好过 select where id in (select ....)
看一下这个贴子中的讨论。
http://topic.csdn.net/u/20090626/16/65f043cf-b9d9-4707-b660-9857461177f4.html
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 是否能编译通过??
INNER JOIN
(SELECT bid FROM a GROUP BY bid HAVING COUNT(*)>=2) b
ON c.bid=b.bid
可见mysql有很多自己的表达方式在delete里面是不能随便使用别名的。