トップページに戻る
次の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式を使って、
存在チェックの結果で分岐させる方法、
外部結合を使う方法、
存在肯定命題の論理積を判定する方法などがあります。