2013-04-22 53 views
0

我试图忽略#tmp表为空时的位置。当#tmp表为空忽略其中

像:

create table #tmp 
    (
    my_id int 
    ) 
create table #tmp2 
    (
    my_name_id int 
    ) 



    select * from foo 
    where foo_id in (select my_id from #tmp) 
and foo_name_id in (select my_name_id from #tmp2) 

而现在的情况。 当我们有一个表格为空时,它不会产生任何结果。
#tmp不是空
#TMP1是空

所以,我在那里用#TMP1应该被忽略。 有什么线索怎么做?

回答

1

只需添加附加条件:

select * from foo 
where (foo_id in (select my_id from #tmp) or not exists(select * from #tmp)) 
and (foo_name_id in (select my_name_id from #tmp2) or not exists(select * from #tmp2)) 

你所采用的一般形式,然而,使它看起来像你正在做一个相当程序的方法来SQL,在那里你存储在临时的部分结果表格,然后结合它们。通常将单个查询写入整个想要的结果会更好,并让SQL Server计算出结果的最佳计算方式(如果需要,还可以缓存中间表单)

+0

感谢您的回答,将尽快进行检查。 我的参数是逗号分隔,我调入#tmp。 – VoonArt 2013-04-22 07:17:41

+0

在这种情况下,请考虑使用空/空的逗号分隔值检查原始参数并执行其他查询。 a)它将比临时表上的NOT EXISTS更快,并且b)您不会因为第一次调用它时给出的值而陷入糟糕的查询计划(请参阅“参数嗅探”的问题) – LoztInSpace 2013-04-22 12:00:44