トップページに戻る
次の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関数を使って、グループ化してます。