まったく同じ列のテーブルが2つあります
表A
idフラグ 1 Y 2 Y 3 N 4 N
表B
idフラグ 1 Y 2 3 N 4
表Aのすべての行を表示するselectクエリをOracleで記述したいと思います。このFLAG
列は、表Bと同じではありませんが、IDの列が一致しています。
結果は次のようになります。
idフラグ 2 Y 4 N
「テーブルAのすべての行...IDの列が一致するテーブルBとして」:
FROM a JOIN b USING (id)
「FLAG列が同じでない場合」:
WHERE a.flag != b.flag
OR (a.flag IS NULL AND b.flag IS NOT NULL)
OR (b.flag IS NULL AND a.flag IS NOT NULL)
したがって、クエリは次のようになります
SELECT id, a.flag
FROM a JOIN b USING (id)
WHERE a.flag != b.flag
OR (a.flag IS NULL AND b.flag IS NOT NULL)
OR (b.flag IS NULL AND a.flag IS NOT NULL)
-WHERE
条件は醜いですが、テーブルbに-valueがあるNULL
が、ない場合、またはその逆の場合をキャッチするために必要です。
これはオーラルで機能します。列にnullがあるため、直接比較できないため、NVL()または同等の関数を使用する必要があります。
select a1.* from table_a a1,table_b b
where A1.id=B.id
and nvl(a1.flag,'y')<>nvl(b.flag,'y')
このsqlfiddleを参照してください:http ://sqlfiddle.com/#!4 / 241de / 1
これでうまくいく、
select Table_A.id,Table_A.FLAG from
Table_A join Table_b on Table_A.id=Table_b.id
where Table_A.FLAG!=Table_b.FLAG
or (Table_b.FLAG is null and table_a.flag is not null);
その場合、を使用して詳細を取得できます。
select a.id, a.flag, b.flag
from table_a a,
table_b b
where a.id = b.id(+)
フラグが等しくない行が必要なので。
select a.id, a.flag, b.flag
from table_a a,
table_b b
where a.id = b.id(+)
and a.flag <> b.flag
また、フラグがnullになる可能性があるかどうかを確認します。その場合、クエリを少し変更する必要があります。
SELECT a.*
FROM tableA a
LEFT JOIN tableB b
ON a.id = b.ID AND
a.FLAG = b.FLAG
WHERE b.ID IS NULL
どうですか
SELECT *
FROM TABLEA
INNER JOIN TABLEB
ON TABLEA.ID = TABLEB.ID
WHERE TABLEA.Flag != TABLEB.FLAG
OR TABLEB.FLAG IS NULL
あなたが冗談を言っているように私には思えました:)そのような場合、Oracleには特別なMINUS演算子があります。 証明リンク
したがって、答えは非常に短く単純です
select id, flag from a
minus
select id, flag from b
PS申し訳ありません-または、テーブルBに対応するIDのレコードが必要ですか?次に、以下を参照してください
select id, flag from a where id in (select id from b)
minus
select id, flag from b