多条件表过滤

数据库高手请绕过。

题目我没想好,说一下更容易明白。想想答案很简单,但是我走了弯路。

有两个结构一样的表:content as c, content_temp as t.主键为ID

t表中含有部分c表数据,以title和answer同时相同为条件确定此数据是否同时存在于两表中,若存在,则删除t表中此条数据。

第一反应构建的是这样的语句:

delete from content_temp t where t.title in (select title from content ) and t.answer in (select answer from content)

仔细一看就知道不行了,in 条件只能有一个。两个in数据库都不知道你要做什么。

后来这样做了,用游标循环,可以实现效果

ExpandedBlockStart.gif View Code
 1  declare   @title   nvarchar ( max );
 2  declare   @answer   nvarchar ( max );
 3 
 4  declare  myCursor  cursor   for
 5  select  title,answer  from  content;
 6 
 7  open  myCursor;
 8  fetch   next   from  myCursor
 9  into   @title , @answer ;
10 
11  while   @@FETCH_STATUS = 0
12  begin  
13       print   @title ;
14       delete   from  content_temp 
15       where  title = @title   and  answer = @answer
16  fetch   next   from  myCursor
17  into   @title , @answer ;
18 
19  end
20 
21  close  myCursor;
22  deallocate myCursor

23 go

 

这样做的结果是速度非常慢,尤其是大数据量,我这个是30万的数据,执行五分钟我就放弃了,估计最少要一个小时能执行完,因为这种做法循环太多。

最终的解决办法是:

delete from content_temp 
where id in (
select t.id from  content_temp t
inner join content c on t.title=c.title and t.answer=c.answer) 

为什么这么简单的问题一定要绕个弯才能想到呢? 数据库高手请绕过。

PS:博客园的代码不显示bug什么时候能解决? 

转载于:https://www.cnblogs.com/dzxw2371/archive/2011/07/27/2118625.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值