我在努力解决这个问题时遇到了很多麻烦。有人可以帮帮我吗?
我有一个包含colA和colB的表,这些是每行的值:
colA ColB
2 1
1 2
在此表中选择时,由于值被反转,我只想检索一行。 如果2意味着1,1意味着2,那么它们是相等的,我不想要两行作为回报。
有没有办法进行SQL查询并获得我想要的结果? 例如,只有一行colA = 1,colB = 2。
答案 0 :(得分:3)
如果只有2列:
WITH t(colA, colB) AS (
VALUES (1,2), (2,1)
)
SELECT DISTINCT least(colA, colB), greatest(colA, colB)
FROM t;
编辑如Daniel所述,虽然这可能会起作用,但这种方法不适合过滤,因为它会更改原始数据。
答案 1 :(得分:3)
没有迹象表明哪个版本的元组优先于另一个版本。即,我们知道(1,2)
等同于(2,1)
,在这种情况下,两个中的一个应该显示,但两者中的哪一个?在此解决方案中,假设具有较低ColA
值的变体优先于反向。
Select ColA, ColB
From SourceData As S
Where ColA < ColB
Or Not Exists (
Select 1
From SourceData As S1
Where S1.ColA = S.ColB
And S1.ColB = S.ColA
)
答案 2 :(得分:3)
可以使用SQL SELECT ... EXCEPT SELECT ...
构造。它也可能比涉及自连接的查询更快,特别是没有任何索引。我建议:
SELECT colA, colB FROM table
EXCEPT
SELECT colB, colA FROM table WHERE colA < colB;
删除重复的行(如果不需要或不需要,请使用EXCEPT ALL
)。
colA = colB的行不是特殊情况,它们会进入结果,重复数据删除。
答案 3 :(得分:1)
自我加入可能有用。
select t1.cola, t1.colb
from tablename t1 join tablename t2 on something
where t1.cola <> t2.colb
and t1.colb <> t2.cola
答案 4 :(得分:0)
如何使用数组?
select a, b from t;
/*
a | b
---+---
1 | 2
2 | 1
(2 rows)
*/
create extension intarray;
select distinct sort(ARRAY[a, b]) from t;
/*
sort
-------
{1,2}
(1 row)
*/