2016-08-31 4 views
2

SQLを考慮しなければならない一つの列として考慮されるべきです例えば以下の表のCOL1、COL2、対応する出力: -SQL 1行</p> <p>ASはで説明したように、これら二つの列の値も2列交換に基づく個別

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

出力

Col1  Col2 
A   B 
C   D 
E   F 
+1

、あなたが実際に何をしたいの詳細でもう少し詳しく説明していただけますか?私はあなたの質問からそれを理解することはできません。 – Guenther

+0

彼は ' 'のすべての一意のペアを列の位置から独立させたいと考えています。つまり、 'A B'と' B A'が2つの異なる行であれば、それらを1つと考えるべきです。 @Guenther – 1000111

+0

@Guentherはい私は同じ結果が必要です。 –

答えて

1

greatestdistinct

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

Demo Here

0

仮定と共にleastとしてみてください:E Fような行がテーブル内の "鏡像" を持たない場合

  • 、その行はそのまま出力に表示されます。つまり、最後の行がE Fの代わりにF Eだった場合は、反転しないでください。ミラーイメージではなく行F Eのみが出力に含まれている必要があります。この要件によって、問題はより面白くなります。そうでなければ、はるかに簡単で解決策はすでに提供されています。
  • col1およびcol2はnull値ではありません。列にヌルがある場合は、実際にヌルが存在する場合に、より詳細な要件を提供する必要があります。

クエリおよび出力:

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 
関連する問題