2010-01-29 103 views
2

我不知道這可能聽起來不可思議......但這裏是我的情況。我必須從兩個表(表1)和(表2)選擇行取消選擇以前選擇

Select * from Table1 Where <SomeCondition> 
Select * from Table2 Where <SomeCondition> 

但我的約束是如果Table1/Table2返回0(零)行...我不應該返回任何結果。

,IE瀏覽器...如果第一次選擇回報說10行,第2個選擇返回0(零)行,我應該叫回第一也選擇...

是臨時表的唯一解決方案,或者我們有其他的選擇嗎?

預先感謝您的答覆...

  • 拉賈

回答

1

一種方法是做一個IF EXISTS第一:

IF EXISTS(SELECT * FROM Table1 WHERE....) AND EXISTS(SELECT * FROM Table2 WHERE....) 
    BEGIN 
     -- Now do your SELECT on each, as both return results 
    END 

EXISTS應該提供良好的性能,它一旦找到匹配的記錄就會停下來。

+0

非常感謝你 – 2010-01-29 13:21:12

0

沒有您的具體查詢的更多細節,這裏是一個選項。只要你的查詢是不是太複雜的也不是很密集的,這應該工作:

Select * from Table1 Where <SomeCondition> 
where exists(Select null from Table2 Where <SomeCondition>); 
Select null from Table2 Where <SomeCondition> 
where exists (Select null from Table1 Where <SomeCondition>); 

在每個語句這隻會選擇行如果其他語句也將返回任何的行數大於零。

0

一個明顯的,但沒有如此高性能的解決方案將是count的行數第一(有關語法不知道):

if not exists(select id from Table1 where ...) or not exists(select id from Table1 where ...) 
    return 

Select * from Table1 Where <SomeCondition> 
Select * from Table2 Where <SomeCondition> 
0

如果您可以使用存儲過程,你可以使用@@ ROWCOUNT檢查如果第二個查詢返回任何結果:

create proc pTest 
as 

Select * from Table1 Where <SomeCondition> 

Select * from Table2 Where <SomeCondition> 
if @@rowcount = 0 return 

go 
+0

這也意味着你沒有額外的選擇或數據庫訪問。這也可以通過腳本完成,因此可以在存儲過程之外完成。 – Mark 2010-01-29 14:03:33

+0

但是,這是否意味着即使第二個查詢不存在任何行,也會執行第一個查詢... – 2010-01-29 19:37:51

+1

正確,但至少相同的查詢不會運行兩次,因爲當使用存在時... – edosoft 2010-01-29 20:19:57