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

5-41 重複値を持つ行を取得

SQLパズル

Table541テーブル
ID  Col1  Col2
--  ----  ----
 1    20     0
 2    10     2
 3    11     1
 4    12     5
 5    14     5
 6    15     3
 7    15     4
 8    15     6

Col1が、他の行のCol1と等しい行、
もしくは、
Col2が、他の行のCol2と等しい行
を出力する。

出力結果
ID  Col1  Col2
--  ----  ----
 4    12     5
 5    14     5
 6    15     3
 7    15     4
 8    15     6


データ作成スクリプト

create Table Table541(
ID   number(1),
Col1 number(2),
Col2 number(1));

insert into Table541 values(1,20,0);
insert into Table541 values(2,10,2);
insert into Table541 values(3,11,1);
insert into Table541 values(4,12,5);
insert into Table541 values(5,14,5);
insert into Table541 values(6,15,3);
insert into Table541 values(7,15,4);
insert into Table541 values(8,15,6);
commit;


SQL

--■■■existsを使う方法■■■
select ID,Col1,Col2 from Table541 a
where exists(select 1 from Table541 b
              where b.RowID != a.RowID
                and (b.Col1=a.Col1 or b.Col2=a.Col2))
order by ID;

--■■■分析関数を使う方法1■■■
select ID,Col1,Col2
from(select ID,Col1,count(Col1) over(partition by Col1) as Col1Count,
               Col2,count(Col2) over(partition by Col2) as Col2Count
       from Table541)
where greatest(Col1Count,Col2Count) >= 2
order by ID;

--■■■分析関数を使う方法2■■■
select ID,Col1,Col2
from(select ID,Col1,count(Col1) over(partition by Col1) as Col1Count,
               Col2,count(Col2) over(partition by Col2) as Col2Count
       from Table541)
where 2 <= any(Col1Count,Col2Count)
order by ID;


解説

分析関数を使う方法では、
パーテーションを切った中でのcountを取得して、
値が等しい行の数を取得してます。