2013-04-22 61 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