2016-08-31 1 views
2

SQL Distinct basierend auf zwei Spalten und auch Austausch dieser beiden Spalten in Betracht gezogen werden, um Werte sollten als eine ZeileSQL Distinct basierend auf zwei Spalten und auch Austausch dieser beiden Spalten Werte als eine Zeile

Wie in Betracht gezogen werden erläutert in das folgende Beispiel, Tabelle Sp1, Sp2 und entsprechende Ausgabe: -

Tabelle

Col 1  Col 2 
A   B 
A   B 
B   A 
C   D 
D   C 
E   F 

Output

Col1  Col2 
A   B 
C   D 
E   F 
Versuchen
+1

Können Sie bitte ein wenig mehr im Detail auszuarbeiten, was Sie wirklich wollen? Ich kann es nicht aus deiner Frage herausfinden. – Guenther

+0

Er möchte alle eindeutigen Paare von '' unabhängig von der Spaltenposition. Das heißt, wenn "A B" und "B A" zwei verschiedene Zeilen sind, sollten Sie sie als einen betrachten. @Guenther – 1000111

+0

@Guenther ja ich brauche das gleiche Ergebnis. –

Antwort

1

mit greatest und least zusammen mit distinct

SELECT 
DISTINCT LEAST(col1,col2), 
GREATEST(col1,col2) 
FROM your_table; 

Demo Here

0

Annahmen:

  • wenn eine Zeile wie E F nicht über sein "Spiegelbild" in der Tabelle, Die Zeile sollte so wie sie ist in der Ausgabe dargestellt werden. Mit anderen Worten, wenn die letzte Zeile F E anstelle von E F war, sollte sie nicht umgedreht werden; nur die Zeile F E, nicht sein Spiegelbild, sollte in der Ausgabe sein. Diese Anforderung macht das Problem interessanter - ansonsten ist es viel einfacher und eine Lösung wurde bereits bereitgestellt.
  • col1 und col2 sind nicht nullfähig. Wenn Sie Nullen in den Spalten haben können, müssen Sie die Anforderungen detaillierter angeben, wenn Nullen tatsächlich vorhanden sind.

Abfrage und Ausgabe:

with 
    input_table (col1, col2) as (
     select 'A', 'B' from dual union all 
     select 'A', 'B' from dual union all 
     select 'B', 'A' from dual union all 
     select 'C', 'D' from dual union all 
     select 'D', 'C' from dual union all 
     select 'E', 'F' from dual union all 
     select 'Z', 'H' from dual 
    ), 
    prep (col1, col2, flag) as (
     select a.col1, a.col2, case when b.col1 is null then 0 else 1 end 
     from input_table a left outer join input_table b 
          on a.col1 = b.col2 and a.col2 = b.col1 
    ) 
select distinct 
     case when flag = 0 then col1 else least (col1, col2) end as col1, 
     case when flag = 0 then col2 else greatest(col1, col2) end as col2 
from prep 
;     

COL1 COL2 
---- ---- 
E F 
A B 
Z H 
C D 
Verwandte Themen