2011-07-10 20 views
1

我有三個查詢,看起來像這些:執行查詢,直到非空的結果

SELECT * FROM Table1 WHERE Column1 = 'a' 
SELECT * FROM Table2 WHERE Column2 = 'b' 
SELECT * FROM Table1 A, Table2 B WHERE A.Column1 <> B.Column1 

現在所有的邏輯是在客戶端實現如下。執行第一個查詢,如果HasRows將標誌設置爲1並返回行。否則,執行第二個查詢,如果HasRows將該標誌設置爲2並返回行。否則,執行第三個查詢,將標誌設置爲3並返回行。

如何用單個查詢做到這一點?我想,旗子的東西,應該解決添加標誌的查詢:

SELECT Flag = 1, * FROM Table1 WHERE Column1 = 'a' 
SELECT Flag = 2, * FROM Table2 WHERE Column2 = 'b' 
SELECT Flag = 3, * FROM Table1 A, Table2 B WHERE A.Column1 <> B.Column1 

但現在什麼?如何查詢,如果查詢返回非空結果?

此外,我想緩存結果,換句話說,爲了避免執行相同的查詢兩次 - 一次用於檢查,第二次用於返回數據。

問候,

回答

3

你可以使用一個表變量來存儲結果,只在SQL塊結束返回。檢查@@rowcount會告訴你前面的insert是否添加了任何行;如果是零,你可以運行進一步查詢:

declare @result table (flag int, col1 int, col2 varchar(50)) 
insert @result select 1, col1, col2 from Table1 where Column1 = 'a' 
if @@rowcount = 0 
    begin 
    insert @result select 2, col1, col2 from Table2 where Column1 = 'b' 
    end 
if @@rowcount = 0 
    begin 
    insert @result select 3, col1, col2 from Table1 A, Table2 B 
     where A.Column1 <> B.Column1 
    end 

select * from @result 

此方法僅如果每個select具有相同的列定義工作。