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

10-64 新旧のデータ比較

SQLパズル

Newテーブル    Oldテーブル
PK1  Col1      PK1  Col1
---  ----      ---  ----
  1  A           0  A
  2  A           2  A
  3  A           3  B
  4  null        4  null
  5  null        5  A
  6  A           6  null

NewテーブルとOldテーブルで、
プライマリキーが等しくて、Col1の値が異なる、
NewテーブルとOldテーブルのデータと、

Newテーブルのみに存在するデータを出力する

出力結果
新旧  PK1  Col1
----  ---  ----
 New    1  A
 New    3  A
 Old    3  B
 New    5  null
 New    6  A


データ作成スクリプト

create table New(
PK1  number(1),
Col1 char(1),
primary key(PK1));

insert into New values(1,'A');
insert into New values(2,'A');
insert into New values(3,'A');
insert into New values(4,null);
insert into New values(5,null);
insert into New values(6,'A');

create table Old(
PK1  number(1),
Col1 char(1),
primary key(PK1));

insert into Old values(0,'A');
insert into Old values(2,'A');
insert into Old values(3,'B');
insert into Old values(4,null);
insert into Old values(5,'A');
insert into Old values(6,null);
commit;


SQL

col 新旧 for a4
col PK1  for 99
col Col1 for a4

select 'New' as 新旧,PK1,Col1 from New
minus select 'New',PK1,Col1 from Old
union all
select 'Old',PK1,Col1 from Old a
 where not exists(select 1 from New b
                   where a.Col1 = b.Col1
                      or coalesce(a.Col1,b.Col1) is null)
order by PK1,1 desc;


解説

coalesce(a.Col1,b.Col1)は、
nvl(a.Col1,b.Col1)で代用することもできます