トップページに戻る    次のSQLパズルへ    前のSQLパズルへ

10-80 データの存在チェック

SQLパズル

Aテーブル
コード
------
A
B
C
D
E

Bテーブル
旧コード  新コード
--------  --------
A         B
B         Z
C         C
D         A
Z         E

Bテーブルの旧コードと新コードの両方が、
Aテーブルのコードに存在するかチェックする

出力結果
旧コード  新コード   存在チェック
--------  --------  ------------
A         B         OK
B         Z         NG
C         C         OK
D         A         OK
Z         E         NG

こちらを参考にさせていただきました


データ作成スクリプト

create table Aテーブル(コード char(1));

insert into Aテーブル values('A');
insert into Aテーブル values('B');
insert into Aテーブル values('C');
insert into Aテーブル values('D');
insert into Aテーブル values('E');

create table Bテーブル(
旧コード char(1),
新コード char(1));

insert into Bテーブル values('A','B');
insert into Bテーブル values('B','Z');
insert into Bテーブル values('C','C');
insert into Bテーブル values('D','A');
insert into Bテーブル values('Z','E');
commit;


SQL

col 旧コード for a8
col 新コード for a8
col 存在チェック for a12

--■■■existsを2回使う方法■■■
select 旧コード,新コード,
case when exists(select 1 from Aテーブル b
                  where b.コード =a.旧コード)
      and exists(select 1 from Aテーブル b
                  where b.コード =a.新コード)
     then 'OK' else 'NG' end as 存在チェック
from Bテーブル a;

--■■■集合演算を使う方法■■■
select 旧コード,新コード,
case when not exists(select a.旧コード from dual
                     union
                     select a.新コード from dual
                     minus
                     select b.コード from Aテーブル b)
     then 'OK' else 'NG' end as 存在チェック
from Bテーブル a;

--■■■外部結合を使う方法■■■
select distinct b.旧コード,b.新コード,
case when a1.コード is not null
      and a2.コード is not null
     then 'OK' else 'NG' end as 存在チェック
  from Bテーブル b,Aテーブル a1,Aテーブル a2
 where b.旧コード = a1.コード(+)
   and b.新コード = a2.コード(+)
order by b.旧コード,b.新コード;

--■■■存在肯定命題の論理積を判定する方法■■■
select 旧コード,新コード,
  case when exists(select 1 from Aテーブル b
                   having max(case when b.コード =a.旧コード then 1 else 0 end)
                        * max(case when b.コード =a.新コード then 1 else 0 end) = 1)
       then 'OK' else 'NG' end as 存在チェック
from Bテーブル a;


解説

case式を使って、
存在チェックの結果で分岐させる方法、
外部結合を使う方法、
存在肯定命題の論理積を判定する方法などがあります。