使用反向/交换值抑制行

时间:2017-10-09 14:43:34

标签: sql stored-procedures distinct hana hana-sql-script

我想查询包含反向值而不是其他行的数据库表。所以表格看起来像这样

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

2 个答案:

答案 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的行不存在或不需要。