2016-04-07 25 views
1

2つの列の値の組み合わせを1つだけ保持するにはどうすればよいですか?SQLフィルタの列の組み合わせ

Iは次のようにテーブル(照会結果)を有する:

行1および2の
ID1 |ID2 |SomeNotImportantComun 
1 |2 |A 
2 |1 |A 
3 |4 |C 

ID1とID2との組み合わせは[1,2]と同じです。私は行の1つを維持したい。

ID1 |ID2 |SomeNotImportantComun 
2 |1 |A 
3 |4 |C 

どうすればいいですか?

+0

2つ以上の複製はありますか?サンプルデータは代表的なものですか? –

+0

重複している場合、どの行を保存したいですか? Alexejはあなたが "注文"を使うことを提案していますが、おそらくあなたの条件は注文と同じくらい単純ではありません。 – mathguy

答えて

3

あなたはこのような何かを試すことができます:あなたはIDの任意の組み合わせのために一つだけの行を保つここ

with test(ID1, ID2, SomeNotImportantComun) as 
(
select 1 ,2, 'A' from dual union all 
select 2 ,1, 'A' from dual union all 
select 3 ,4, 'C' from dual 
) 
select id1, id2, SomeNotImportantComun 
from (
     select id1, id2, SomeNotImportantComun, 
       row_number() over (partition by least(id1, id2), greatest(id1, id2) order by id1 desc, id2 desc) as rank 
     from test 
    ) 
where rank = 1 

order by句を編集して、保存したいものを決めることができます

1

このクエリを使用して、対称ペアが存在する場合に不要な行を見つけます。

select t1.* 
from tablename t1 
join tablename t2 on t1.id1 = t2.id2 and t1.id2 = t2.id1 
and t1.somenotimpcol = t2.somenotimpcol 
where t1.id1 < t1.id2 

そして元のテーブル/クエリ結果から、これらの行を排除するminusを使用します。

select * from tablename 
minus 
select t1.* 
from tablename t1 
join tablename t2 on t1.id1 = t2.id2 and t1.id2 = t2.id1 
and t1.somenotimpcol = t2.somenotimpcol 
where t1.id1 < t1.id2