使用具有反转值的列消除行

时间:2014-10-31 19:30:07

标签: sql database postgresql

我在努力解决这个问题时遇到了很多麻烦。有人可以帮帮我吗?

我有一个包含colA和colB的表,这些是每行的值:

colA  ColB
2     1
1     2

在此表中选择时,由于值被反转,我只想检索一行。 如果2意味着1,1意味着2,那么它们是相等的,我不想要两行作为回报。

有没有办法进行SQL查询并获得我想要的结果? 例如,只有一行colA = 1,colB = 2。

5 个答案:

答案 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)
*/