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

6-1 二つのテーブルの列値の一致数を取得

SQLパズル

テーブルX        テーブルY
 A   B   C        A   B   C
--  --  --       --  --  --
 0   0   0        1   1   1
 1   0   0
 1   1   0

テーブルXとテーブルYの直積と、同じ名前の列で、値が一致する数を出力する。
例えば、X.a = Y.a, X.b = Y.b, X.c <> Y.c だと一致数は2となる。

出力結果
X.a  X.b  X.c  Y.a  Y.b  Y.c  一致数
---  ---  ---  ---  ---  ---  ------
  0    0    0    1    1    1      0
  1    0    0    1    1    1      1
  1    1    0    1    1    1      2


データ作成スクリプト

create table X(
a number(1),
b number(1),
c number(1));

create table Y as select * from X;

insert into X values(0,0,0);
insert into X values(1,0,0);
insert into X values(1,1,0);
insert into Y values(1,1,1);
commit;


SQL

select X.a as "X.a",X.b as "X.b",X.c as "X.c",
       Y.a as "Y.a",Y.b as "Y.b",Y.c as "Y.c",
decode(X.a,Y.a,1,0)+
decode(X.b,Y.b,1,0)+
decode(X.c,Y.c,1,0) as 一致数
from X,Y;


解説

クロスジョインを使って集合同士の直積を求めて、
decode関数で、同じ名前の列で、値が一致する数を求めてます。