2 つのクエリをマージしたい。
いくつかの ID を返す Query1 があります。
次に、いくつかの ID がテーブルに存在するかどうかを最初にチェックする Query2 があります。そうでない場合、結果は Query1 によって返された ID になります。
はいの場合、Query1 と Query2 によって返される Id の交差のように、Query1 と Query2 によって返される共通の Id が必要です。
では、単一のクエリでこれを行うにはどうすればよいでしょうか。
2 つのクエリをマージしたい。
いくつかの ID を返す Query1 があります。
次に、いくつかの ID がテーブルに存在するかどうかを最初にチェックする Query2 があります。そうでない場合、結果は Query1 によって返された ID になります。
はいの場合、Query1 と Query2 によって返される Id の交差のように、Query1 と Query2 によって返される共通の Id が必要です。
では、単一のクエリでこれを行うにはどうすればよいでしょうか。
これは、DECODEステートメントとCASEステートメントの組み合わせを使用して実現できます。
SELECT DISTINCT BT1.ID
FROM BUFFER_TABLE_1 BT1, BUFFER_TABLE_2 BT2
WHERE DECODE((SELECT COUNT(BT1.ID)
FROM BUFFER_TABLE_1 BT1, BUFFER_TABLE_2 BT2
WHERE BT1.ID = BT2.ID),
0,
'TRUE',
(SELECT CASE
WHEN BT1.ID = BT2.ID THEN
'TRUE'
ELSE
'FALSE'
END
FROM DUAL)) = 'TRUE'
ORDER BY BT1.ID
主な部分はデコードで使用されます。両方のテーブルから一致するIDの数がゼロの場合、すべてのIDが最初のテーブル(BUFFER_TABLE_1)から返されます。ただし、このカウントが0より大きい場合は、両方のテーブルのIDが一致し、共通のIDのみが返されます。
それが役に立てば幸い
(すでに私の回答を読んだ人向け:保存したい@nawfalのコメントのために大幅に再編集されました)
最初に、私はあなたの問題を正しく理解していることを明確にしたいと思います。
あなたは部品を持っています:
select id from table1
それはResult1を生成しますselect id from table2 where <some condition>
それはResult2を生成しますselect count(id) > 0 from table2 where <some condition>
これにより、使用する結果が決まります3. が複数を返す場合、1. AND 2. によって返される行が必要です (ただし、1. OR 2. によってのみ返される行は必要ありません)。
3. が 0 を返す場合、1 の結果が必要です。
-> 解決策は、ビューに 3. を含め、union ステートメントの where 句で 2 回選択することです。
このような:
SELECT t1.id FROM table1 t1 WHERE
(SELECT COUNT(t2.id) from table2 t2 where <some condition>) = 0
UNION
select t2.id from table2 t2 WHERE <some condition>
AND t2.id IN (SELECT t1.id FROM table1 t1)
AND (SELECT COUNT(t2.id) from table2 t2 where <some condition>) > 0
2 つの部分のいずれかは常に空になります (クエリ 3. は同時に = 0 と > 0 になることはできないため)