2011-10-18 119 views
1

我工作用表有两列是相同的键,行包含重复的值,但在不同的列去除重复行:SQL二进制关系

A1 | A2 
---+--- 
b | c 
c | b 

有减少这种办法只有一行?


编辑:很抱歉的不确定性。我希望输出是b | c或c | b。 如果我有更像值的表:

b|c 
c|b 
d|e 
e|d 

我想要的东西,如:

b|c 
d|e 
+0

你的问题还不清楚。你可以请举一些例子输出去与你的例子输入? – 2011-10-18 15:29:13

+0

你想检测这些“重复”,所以你可以删除它们,或者因为b/c已经过去了,所以排除了c/b组合? –

+1

这取决于......“A1”和“A2”是什么意思? –

回答

-1
select distinct A1 from Table1 
union 
select distinct A2 from Table1 
+0

这不是两行吗?这个问题不是很清楚,但他确实表示他不会将其降为一行。 –

+0

-1:对不起,错过了这一点。 –

3

我通过中介表做到这一点。这里是我会做什么:

SELECT DISTINCT 
    CASE WHEN A1 >= A2 THEN A1 ELSE A2 END A1 
    ,CASE WHEN A1 >= A2 THEN A2 ELSE A1 END A2 
INTO 
    T2 
FROM 
    T1 

DROP TABLE T1 
SELECT * INTO T1 FROM T2 
DROP TABLE T2 
+1

使用PostgreSQL,Oracle或MySQL,您可以用最少和最大替换CASE表达式。 –

+1

该标签只表示SQL,但是对于将来还是值得注意的。 – briantyler

+0

不需要中间表。 –

0

假设这些值可以正确排序:

SELECT DISTINCT least(a1), greatest(a2) 
FROM table1 

如果A1和A2不能正确排序的值,这虽然不会工作。

1
SELECT A1, A2 
    FROM YourTable 
WHERE A1 < A2 
UNION 
SELECT A2 AS A1, A1 AS A2 
    FROM YourTable 
WHERE A1 > A2; 

一旦您修复了数据,请添加一个约束,例如

CHECK (A1 < A2);