基于两个COLUMNS的SQL Distinct以及这两个列值的交换应该被视为一行

时间:2016-08-31 07:53:28

标签: java mysql oracle11g

基于两个COLUMNS的SQL Distinct以及这两个列值的交换应该被视为一行

如下例所示,表col1,col2和相应的输出: -

@POST @Path("/params")
@Produces(MediaType.TEXT_PLAIN)
@Consumes(MediaType.APPLICATION_XML)
public String postParams(ParamRequest myRequest) {
    myRequest...
    ...
}

输出

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

2 个答案:

答案 0 :(得分:1)

尝试使用greatestleast以及distinct

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

Demo Here

答案 1 :(得分:0)

假设:

  • 如果像E F这样的行没有"镜像"在表中,行应按原样表示在输出中。换句话说,如果最后一行是F E而不是E F,则不应该翻转;只有行F E,而不是它的镜像,应该在输出中。这个要求使问题更加有趣 - 否则它会更容易,并且已经提供了解决方案。
  • col1col2不可为空。如果列中可能包含空值,则在实际存在空值时,您需要提供更详细的要求。

查询和输出:

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