私は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' を設定しWHERE
、UNION
それらを組み合わせ、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
。