我想查询包含反向值而不是其他行的数据库表。所以表格看起来像这样
Src Trgt ValueA ValueB
A B 1,44 5
B A 1,44 5 <--
C D 1,23 8
D C 1,23 8 <--
F G 5,12 9
G F 5,12 9 <--
我想要的是一个查询,它返回所有不再交换源和目标值的行。不应查询的行是与另一行具有相同值A和B的行,但仅交换源和目标值(上表中标记的行) 因此,期望的结果将如下所示:
Src Trgt ValueA ValueB
A B 1,44 5
C D 1,23 8
F G 5,12 9
答案 0 :(得分:1)
我认为这就是你想要的:
select t.*
from t
where t.src < t.trgt
union all
select t.*
from t
where t.src > t.trgt and
not exists (select 1
from t t2
where t2.src = t.trgt and t2.trgt = t.src and
t2.a = t.a and t2.b = t.b
);
它保持遇到的第一行,过滤掉前两列切换的等效行。
编辑:
如果每个组合只有一行,则另一种方法是:
select least(src, trgt) as src, greatest(src, trgt) as trgt, a, b
from t
group by least(src, trgt), greatest(src, trgt), a, b;
这会产生返回不在原始数据中的行的风险(如果该行没有重复且trgt > src
。
答案 1 :(得分:1)
SELECT *
FROM ztable zt
WHERE zt.source < zt.target -- pick only one of the twins
OR NOT EXISTS( -- OR :if it is NOT part of a twin
SELECT *
FROM ztable nx
WHERE nx.source = zt.target
AND nx.target = zt.source
);
假设source=target
的行不存在或不需要。