2 つの選択ステートメントを 1 つに結合するにはどうすればよいでしょうか? 質問する

2 つの選択ステートメントを 1 つに結合するにはどうすればよいでしょうか? 質問する

私はSQL構文に関しては初心者です。

もちろん、たくさんの行と列を持つテーブルがあります :P 次のようになっているとします。

      AAA BBB CCC DDD
-----------------------
Row1 | 1   A   D   X
Row2 | 2   B   C   X
Row3 | 3   C   D   Z

ここで、次のような組み合わせ (ここでは疑似 SQL 風) を返す高度な SELECT ステートメントを作成します。

select 'Test1', * from TABLE Where CCC='D' AND DDD='X'
select 'Test2', * from TABLE Where CCC<>'D' AND DDD='X'

出力は次のようになります。

Test1, 1, A, D, X
Test2, 2, B, C, X

これら 2 つの SELECT ステートメントを 1 つの適切な SELECT ステートメントに結合するにはどうすればよいでしょうか?

以下のように SQL を複雑にした場合 (自分の SQL ステートメントに exists ステートメントが含まれているため)、機能しますか? 選択を組み合わせて、それをもう少し高度な SQL に適用する方法を知りたいだけです。

select 'Test1', * from TABLE Where CCC='D' AND DDD='X' AND exists(select ...)
select 'Test2', * from TABLE Where CCC<>'D' AND DDD='X' AND exists(select ...)




私の実際の SQL ステートメントは次のとおりです。

select Status, * from WorkItems t1
where  exists (select 1 from workitems t2 where t1.TextField01=t2.TextField01 AND (BoolField05=1) )
AND TimeStamp=(select max(t2.TimeStamp) from workitems t2 where t2.TextField01=t1.TextField01) 
AND TimeStamp>'2009-02-12 18:00:00'

これで結果が得られます。ただし、この選択ステートメントのコピーと結合して、最後に AND を追加すると、「ステータス」フィールドが「DELETED」などの文字列に変更されます。

select 'DELETED', * from WorkItems t1
where  exists (select 1 from workitems t2 where t1.TextField01=t2.TextField01 AND (BoolField05=1) )
AND TimeStamp=(select max(t2.TimeStamp) from workitems t2 where t2.TextField01=t1.TextField01) 
AND TimeStamp>'2009-02-12 18:00:00'
AND NOT (BoolField05=1)

ベストアンサー1

ここでは 2 つの選択肢があります。1 つ目は、句の条件に基づいて 'Test1' または 'Test2' を設定しWHEREUNIONそれらを組み合わせ、2 つの結果セットを作成することです。

select 
    'Test1', * 
from 
    TABLE 
Where 
    CCC='D' AND DDD='X' AND exists(select ...)
UNION
select 
    'Test2', * 
from 
    TABLE
Where
    CCC<>'D' AND DDD='X' AND exists(select ...)

実際には TABLE を 2 回スキャン/シークすることになるため、これが問題になる可能性があります。

他の解決策としては、テーブルから一度選択し、テーブル内の条件に基づいて「Test1」または「Test2」を設定することです。

select 
    case 
        when CCC='D' AND DDD='X' AND exists(select ...) then 'Test1'
        when CCC<>'D' AND DDD='X' AND exists(select ...) then 'Test2'
    end,
    * 
from 
    TABLE 
Where 
    (CCC='D' AND DDD='X' AND exists(select ...)) or
    (CCC<>'D' AND DDD='X' AND exists(select ...))

CASEここでの注意点は、ステートメントとステートメント内のフィルター条件を複製する必要があることですWHERE

おすすめ記事