2

私はAとBの2つのテーブルを持っています。BはAのサブセットです。私がしたいのはこれです:テーブルAにフラグ列を追加します(表示専用で、テーブルに永続的にはありません)。このフラグの値は次のようになります。 AとBの間の共通行の場合は「はい」、非共通行の場合は「いいえ」。例:

A table
Column1 Column2 Column3
X1      X2      X3
Y1      Y2      Y3
Z1      Z2      Z3

select * from A where column1=Y1; to get B

これで、最終的な出力は次のようになります。

Column1 Column2 Column3 FLAG
X1      X2      X3      NO   
Y1      Y2      Y3      YES 
Z1      Z2      Z3      NO

1つのSQLステートメントのコードブロックの下にあるすべてのものを実行する必要があります(Bを抽出してフラグを追加します)。Bを抽出できます。フラグを追加できません

oracle 11.2.0.2.0、sqlplusを使用する

4

3 に答える 3

9

外部結合を使用してテーブルAとBを条件付きでリンクし、次にCASE()ステートメントを使用してAの特定の行がBの行と一致するかどうかをテストします。

select a.*
       , case when b.column1 is not null then 'YES' else 'NO' end as flag
from a left outer join b
        on a.column1 = b.column1

これは、B.COLUMN1のインスタンスが0または1つしかない場合にのみ正しく機能することに注意してください。BにCOLUMN1の任意の値の複数のインスタンスが含まれている場合は、次のバリアントを使用できます。

select a.*
       , case when b.column1 is not null then 'YES' else 'NO' end as flag
from a left outer join ( select distinct column1 from b ) b
        on a.column1 = b.column1
于 2012-07-16T13:25:22.743 に答える
2

あなたはこのようなことを試すことができます:

SELECT A.*, 
       CASE WHEN EXISTS 
            (SELECT Column1 FROM B WHERE Column1=A.Column1) 
       THEN "YES" 
       ELSE "NO"
       END
FROM A

私のPL-SQLは少し錆びています、ここからの例

BでLEFTJOINを実行して、B.Column1がNULLかどうかを確認することもできます。

于 2012-07-16T10:53:36.330 に答える
2
SELECT A.*, 'NO' 
FROM A
WHERE NOT EXISTS 
(SELECT 1 FROM B
WHERE B.COL1 = A.COL1
AND B.COL2 = A.COL2
AND B.COL3 = A.COL3) -- gets records only in A
UNION ALL 
(SELECT B.*, 'YES')  -- gets B records which are a subset of A

BはAのサブセットであるため、エイリアス列に対してこれらのレコードにYESのタグを付ける必要があることはすでにご存知でしょう。別のレコードセットに存在する、または存在しない1つのレコードセットからレコードを削除する従来の方法は、もちろんEXISTS句を使用することです。EXISTS句の利点は、ブール演算子であり、呼び出しにTRUEまたはFALSEを返すことです。そして、このリターンは、テーブルのフルスキャンを必要とせずに発生します-したがって、(一般的に)より高速です。MINUS句を使用することもできますが、より効率的かもしれません。EXPLAINPLANをオンにしてみてください。

于 2012-07-16T13:38:06.720 に答える