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

2-1-7 要素数が1の集合同士の比較

SQLパズル

テーブル1                     テーブル2
ID  名前      戦闘  采配      ID   名前      戦闘  采配
--  --------  ----  ----      --  --------  ----  ----
 1  織田信長    70    94       1  吉法師      70    94
 2  柴田勝家    86    85       2  柴田勝家    85    86
 3  前田利家    69    72       4  明智光秀    61    87
 5  木下秀吉    59    91       5  木下秀吉    59    91
 6  徳川家康  null  null       6  null      null  null

テーブル1のID、名前、戦闘、采配と、
同一IDのテーブル2の名前、戦闘、采配を比較し、
テーブル2と値が違っているデータ、および、テーブル2と値が等しいデータを出力する。

出力形式は、
テーブル1のID,テーブル1の名前,テーブル1の戦闘,テーブル1の采配,
'テーブル2と一致'もしくは'テーブル2と不一致'
とする。

出力結果
ID  名前      戦闘  采配  一致情報
--  --------  ----  ----  -----------------
 1  織田信長    70    94  テーブル2と不一致
 2  柴田勝家    86    85  テーブル2と不一致
 5  木下秀吉    59    91  テーブル2と一致


データ作成スクリプト

create table テーブル1(
ID   number(1),
名前 char(8),
戦闘 number(3),
采配 number(3),
primary key(ID));

create table テーブル2(
ID   number(1),
名前 char(8),
戦闘 number(3),
采配 number(3),
primary key(ID));

insert into テーブル1 values(1,'織田信長',70,94);
insert into テーブル2 values(1,'吉法師'  ,70,94);
insert into テーブル1 values(2,'柴田勝家',86,85);
insert into テーブル2 values(2,'柴田勝家',85,86);
insert into テーブル1 values(3,'前田利家',69,72);
insert into テーブル2 values(4,'明智光秀',61,87);
insert into テーブル1 values(5,'木下秀吉',59,91);
insert into テーブル2 values(5,'木下秀吉',59,91);
insert into テーブル1 values(6,'徳川家康',null,null);
insert into テーブル2 values(6,null,null,null);
commit;


SQL

--■■■union allを使う方法■■■
select ID,名前,戦闘,采配,'テーブル2と一致' as 一致情報
from テーブル1 a
where (名前,戦闘,采配) = (select b.名前,b.戦闘,b.采配 from テーブル2 b
                           where b.ID = a.ID)
union all select ID,名前,戦闘,采配,'テーブル2と不一致' as 一致情報
from テーブル1 a
where (名前,戦闘,采配) != (select b.名前,b.戦闘,b.采配 from テーブル2 b
                           where b.ID = a.ID)
order by ID;


解説

要素数が1の集合同士で、等しい、等しくないの演算が使えます。
数式のイメージは、ベクトルの等しい、等しくないの定義に似てます。

徳川家康の行が出力されてないことから分かるように、
=および、!=での比較では、
nullとnullは、等しいと判定されないです。