トップページに戻る
次の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)で代用することもできます