考虑
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)必须不存在
答案 0 :(得分:7)
您没有说明您的DBMS,但这适用于许多DBMS(least
和greatest
不幸的是不是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
或者,如果a
和b
之间的含义没有差异,您可以强制执行约束,迫使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)到工作(或临时)表中来保持所需的内容。
从此决赛桌中选择将显示您的结果。删除工作表,或者在会话结束时删除临时表。
此外,您可以将此逻辑放在存储过程中。
请注意,游标是内存密集型的,尤其是在使用不当的情况下。但对于非平凡或复杂的逻辑非常方便。