我有一张桌子" 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)。
答案 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)
使用least
和greatest
。
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
);