0

我想查询一个数据库表,其中包含与其他行具有相反值的行。所以表格看起来像这样

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
4

2 回答 2

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.

于 2017-10-09T14:46:49.247 回答
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
        );

Assuming that rows with source=target are not present or not wanted.

于 2017-10-14T12:23:06.740 回答