【问题标题】:How to remove mirror results in PosgreSQL?如何删除 PostgreSQL 中的镜像结果?
【发布时间】:2020-02-27 18:23:32
【问题描述】:

我不知道如何删除这样的镜像结果:

select
b.column1 as result1,
c.column2 as result2
from table a
left join table b on a.column1 = b.column1
left join table c on a.column2 = c.column1;

我得到的结果如下:

result1|results2
b1     |b22
b5     |b66
b74    |b31
......
b22    |b1
b66    |b5
b31    |b74

我怎么能只得到第一个组合 - 如果有组合 b1-b22,我不需要 b22-b1。

我尝试了 b.column1 和 c.column1 之和的不同之处 - 我将它们转换为 int 并且它有效,但我不认为这是最好的方法,因为可能存在来自不同组合的重复总和我会丢失一些数据。

【问题讨论】:

标签: sql postgresql join left-join


【解决方案1】:

如果您没有所有组合,这有点棘手。您的示例结果没有null,所以我将joins 更改为inner joins,然后使用distinct on

select distinct on (least(b.column1, c.column2), greatest(b.column1, c.column2))
       b.column1 as result1, c.column2 as result2
from table a join
     table b
     on a.column1 = b.column1 join
     table c
     on a.column2 = c.column1
order by least(b.column1, c.column2), greatest(b.column1, c.column2);

实际上,正如您的查询所表达的那样,joins 似乎根本不需要。所以你可以考虑:

select distinct on (least(a.column1, a.column2), greatest(a.column1, a.column2))
       a.column1 as result1, a.column2 as result2
from table a
order by least(a.column1, a.column2), greatest(a.column1, a.column2);

【讨论】:

    【解决方案2】:

    一种方法是在最后一个join中添加一个不等式条件:

    select
        b.column1 as result1,
        c.column2 as result2
    from table a
    left join table b on a.column1 = b.column1
    left join table c on a.column2 = c.column1 and b.column1 < c.column2
    

    【讨论】:

      【解决方案3】:

      “删除镜像结果”听起来像是要删除。这似乎最好用 Exists 子句来解决:

      delete from rtab r1
       where r1.result1 > r1.result2 
         and exists (select null 
                       from rtab r2
                      where r1.result1 = r2.result2
                        and r1.result2 = r2.result1
                     );
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2014-02-19
        • 2022-12-26
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 1970-01-01
        • 2011-09-14
        相关资源
        最近更新 更多