如何在SQL中从两列中查找唯一对?

时间:2018-02-22 22:25:54

标签: mysql sql database

我有一张桌子" Dummy"列#34; col1和col2"。

如何从(col1,col2)中找到唯一对。例如,在上表中,我如何得到(a,b)或(b,a)仅作为我的输出,而不是(a,b)和(b,a)。

select
    distinct
    col1
    col2
from
    dummy
where
    dummy.col1 < dummy.col2
group by
    col1,
    col2;

上述查询错误,因为错过了对(d,c)。

Wrong query

4 个答案:

答案 0 :(得分:2)

我宁愿使用concat和group by

SELECT 
col1,col2 
FROM 
tbl
GROUP BY CONCAT(LEAST(col1, col2), 
              GREATEST(col1, col2))

或简单

SELECT 
    col1,col2 
    FROM 
    tbl
group by LEAST(col1, col2),GREATEST(col1, col2)

答案 1 :(得分:0)

使用leastgreatest

select least(col1,col2),greatest(col1,col2) 
from tbl
group by least(col1,col2),greatest(col1,col2) 

但是如果只存在一对(x,y)或(y,x),这可能会返回表中没有的行。

为避免这种情况,请使用

select least(col1,col2) as col1,greatest(col1,col2) as col2
from tbl
group by least(col1,col2),greatest(col1,col2) 
having count(*)>1
union all
select col1,col2 
from tbl
where (least(col1,col2),greatest(col1,col2)) in (select least(col1,col2) as col1,greatest(col1,col2) as col2
                                                 from tbl
                                                 group by least(col1,col2),greatest(col1,col2) 
                                                 having count(*)=1
                                                )    

答案 2 :(得分:0)

SELECT
    x,
    y
FROM
(

    SELECT
        DISTINCT
        col1 AS x,
        col2 AS y
    FROM
        dummy
    WHERE
        col1 <> col2

    UNION

    SELECT
        DISTINCT
        col1 AS y,
        col2 AS x
    FROM
        dummy
    WHERE
        col1 <> col2
)

答案 3 :(得分:0)

如果您不在乎是否以正确的顺序返回现有组合,例如a,b也可能会返回b,a

SELECT DISTINCT
  CASE WHEN col1 > col2 THEN col2 ELSE col1 end, -- similar to LEAST
  CASE WHEN col1 < col2 THEN col2 ELSE col1 end  -- similar to GREATEST
FROM dummy
;

但如果你必须返回现有的行,那就更复杂了:

SELECT t1.*
FROM dummy AS t1 LEFT JOIN dummy AS t2
ON  t1.col1 = t2.col2
AND t1.col2 = t2.col1
AND t1.col1 > t2.col1
WHERE t2.col1 IS NULL
;

SELECT col1,col2
FROM dummy AS t1
WHERE NOT EXISTS(
  SELECT * FROM dummy t2
  WHERE t1.col1 = t2.col2
    AND t1.col2 = t2.col1
    AND t1.col1 > t2.col1
);