有两张数据表,都有一个ID字段,把一个表中与另外一个表中重复的记录删除

表a和表b,都有一个叫id的字段。
请问现有两个SQL语句:
delete from a where id in (select b.id from b left join a on b.id=a.id)
和 delete from a where id in (select b.id form b)
请问结果是否完全一样。我认为是一样的,再问两语句有何区别
感谢大家,如表A有几十万的记录,表B有几万的记录。现在有三种SQL语句:
1.delete from a where id in (select b.id from b left join a on b.id=a.id)
2.delete from a where id in (select b.id form b)
3.delete from a where id in (select b.id from b inner join a on b.id=a.id)
哪个语句更快些,性能更好些,因为两表的记录比较多

结果是一样的,因为你是要删除a表中的ID在B表中存在记录,区别就是:
(select b.id from b left join a on b.id=a.id)结果集和(select b.id form b)的结果集是一样的,只不过一个是用左连接得到,一个是直接SELECT

理论上是你第3条语句效率更高点,因为IN操作的范围可能会比其他两条语句的小

由于你要操作上万的记录,有文章介绍不推荐用IN操作,象这样写:
delete from a where exists(select 1 from b where a.id=b.id)据说性能更好,弄台慢点的机器,看看这些语句的执行时间就看出来了,其实我感觉效率应该和delete from a where id in (select b.id from b inner join a on b.id=a.id)差不多
温馨提示:答案为网友推荐,仅供参考
第1个回答  2009-07-16
我分析了一下,和你的认识是一样的,而且我认为这两句是没有区别的。
因为:
【select b.id from b left join a on b.id=a.id】和【select b.id form b】得到的结果集是一样的,不仅这样下面这句话和它们也是一个效果的:
【delete from a where id in (select b.id from b inner join a on b.id=a.id)】

因为他们的【in】子查询得到的结果集都是至少包含要删除目标表数据的。

---
以上,希望对你有所帮助。
第2个回答  2009-07-16
结果完全一样的,
语句1:select b.id from b left join a on b.id=a.id

语句2:select b.id form b
主要区别:
语句1用了一个左连接,
所以查询结果满足左面的表b,
因此查询的结果罗列出表b的所有ID,
如果用INNER JOIN 则只罗列出表b 和表a共有的ID

语句2 就不用说了,列出表b的所有ID
相似回答