2011-07-10 1 views
1

までのクエリを実行します。 HasRowsの場合、最初のクエリを実行してフラグを1に設定し、行を返します。それ以外の場合は、HasRowsの場合は2番目のクエリを実行し、フラグを2に設定して行を返します。それ以外の場合は、3番目のクエリを実行し、フラグを3に設定して行を返します。は、私はこれらのように見える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 

今は何ですか?問合せが空でない結果を戻すかどうかをチェックする方法は?

また、私は結果をキャッシュしたいと思います。つまり、同じクエリを2回実行することを避けたいのです。チェックのために1回、データを返すために2回目です。

よろしく、

答えて

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は、同じ列の定義を持っている場合にのみ機能します。

関連する問題