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

8-31 逆関係の行を求める

SQLパズル

RevTable
Test1  Test2
-----  -----
   20     20
   50     25
   20     20
   60     30
   70     90
   80    130
   90     70
  100     50
  110     55
  120     60
  130     80
  140     70

逆関係になっている行を求める。

逆関係というのは、以下の関係です。

自分の行のTest1 = 相手の行のTest2
かつ
自分の行のTest2 = 相手の行のTest1

出力結果
Test1  Test2
-----  -----
   20     20
   70     90
   80    130

SQLクックブックのレシピ11.4を参考にさせていただきました


データ作成スクリプト

create table RevTable(Test1,Test2) as
select  20, 20 from dual union all
select  50, 25 from dual union all
select  20, 20 from dual union all
select  60, 30 from dual union all
select  70, 90 from dual union all
select  80,130 from dual union all
select  90, 70 from dual union all
select 100, 50 from dual union all
select 110, 55 from dual union all
select 120, 60 from dual union all
select 130, 80 from dual union all
select 140, 70 from dual;


SQL

select Least(Test1,Test2) as Test1,
       greatest(Test1,Test2) as Test2
  from RevTable
group by Least(Test1,Test2),greatest(Test1,Test2)
having count(*) >= 2
order by Test1,Test2;


解説

Least関数とgreatest関数を使って、グループ化してます。