在SQL中选择DISTINCT对COLUMN

时间:2014-03-14 07:09:53

标签: sql

考虑

create table pairs ( number a, number b )

数据在哪里

1,4
4,1
2,4
2,4
3,2
3,2
2,3
5,1
Etc.

我正在接受这个

1,4
4,1
2,4
3,2
2,3
5,1

什么查询为我提供了列b的数字的不同值所以我可以看到

1,4
5,1
2,4
3,2

我不希望列a中的值应该出现在列b中。请帮忙。

我需要的是在列的两侧选择不同的值。例如。如果存在(1,2)那么(2,1)必须不存在

5 个答案:

答案 0 :(得分:7)

您没有说明您的DBMS,但这适用于许多DBMS(leastgreatest不幸的是不是SQL标准的一部分)

select distinct least(a,b), greatest(a,b)
from pairs

答案 1 :(得分:3)

select distinct p1.a from pairs
inner join pairs p2 on p1.a=p2.b

答案 2 :(得分:0)

您可以按摩数据并将较小的值放在首位:

SELECT CASE WHEN a < b THEN a ELSE b END a,
       CASE WHEN a < b THEN b ELSE a END b
FROM pairs

然后你可以选择与此区别开来:

SELECT DISTINCT a, b
FROM
(
    SELECT CASE WHEN a < b THEN a ELSE b END a,
           CASE WHEN a < b THEN b ELSE a END b
    FROM pairs
) x

或者,如果ab之间的含义没有差异,您可以强制执行约束,迫使a 总是小于或等于b,控制着途中的数据。然后你可以做一个简单的SELECT DISTINCT

答案 3 :(得分:-1)

您可以尝试此查询以获取列a

中的所有不同值
SELECT distinct(a) FROM pairs WHERE not exists(select b from pairs where a=b)

答案 4 :(得分:-1)

听起来你需要你自己的扩展版DISTINCT。

你可以这样做(在SQL Server中)......通过CURSOR。

从表中加载光标。循环遍历游标,模式匹配并通过在每个游标迭代中填充(INSERT)到工作(或临时)表中来保持所需的内容。

从此决赛桌中选择将显示您的结果。删除工作表,或者在会话结束时删除临时表。

此外,您可以将此逻辑放在存储过程中。

请注意,游标是内存密集型的,尤其是在使用不当的情况下。但对于非平凡或复杂的逻辑非常方便。