多条件表过滤

数据库高手请绕过。

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

有两个结构一样的表: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数据库都不知道你要做什么。

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

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什么时候能解决? 

posted @ 2011-07-27 17:13 迈克尔二孬 阅读(73) 评论(1) 编辑 收藏