2016-04-07 23 views
1

Wie kann ich nur eine Kombination der Werte von zwei Spalten beibehalten?SQL Filter Kombinationen von Spalten

Ich habe eine Tabelle (Abfrageergebnis) wie:

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

für Zeile 1 und 2 ist die Kombination von ID1 und ID2 ist die gleiche [1,2]. Ich möchte nur eine der Reihen behalten.

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

Wie kann ich das tun?

+0

bearbeiten Können Sie mehr als zwei Duplikate haben? Sind die Beispieldaten repräsentativ? –

+0

Welche Zeile möchten Sie behalten, wenn Sie Duplikate haben? Alexej schlägt vor, dass Sie "order by" verwenden können - aber vielleicht sind Ihre Bedingungen nicht so einfach wie das Bestellen. – mathguy

Antwort

3

Sie können mit so etwas wie dies versuchen:

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 

Sie Hier halten nur eine Zeile für jede Kombination von IDs; Sie können entscheiden, welche Sie behalten möchten, indem Sie die order by Klausel

1

Verwenden Sie diese Abfrage, um Zeilen zu finden, die nicht benötigt werden, wenn ein symmetrisches Paar existiert.

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 

Dann minus verwenden Sie diese Zeilen aus dem ursprünglichen Tabelle/Abfrage-Ergebnis zu beseitigen.

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 
Verwandte Themen