在SQL中选择不同的列对

在SQL中选择不同的列对,sql,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就不能存在您没有说明您的数据库管理系统,但这在许多数据库管理系统上都

考虑

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就不能存在

您没有说明您的数据库管理系统,但这在许多数据库管理系统上都起作用。不幸的是,最小和最大的数据库管理系统都不是SQL标准的一部分

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

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

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

或者,如果a和b之间的含义没有差异,则可以强制执行一个约束,强制a始终小于或等于b,从而控制输入过程中的数据。然后您只需执行一个简单的SELECT DISTINCT操作。

您可以尝试此查询以获取列a中的所有DISTINCT值

SELECT distinct(a) FROM pairs WHERE not exists(select b from pairs where a=b)

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

您可以在SQL Server中执行此操作。。。通过光标

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

从最后的表格中选择将显示您的结果。删除工作表,否则临时表将在会话结束时删除

还可以将此逻辑放入存储过程中


注意,游标是内存密集型的,特别是在未正确使用时。但对于非平凡或复杂的逻辑非常方便。

您是否在寻找从对中选择不同的A、B?这将只返回一列,他/她需要两列
SELECT distinct(a) FROM pairs WHERE not exists(select b from pairs where a=b)