【问题标题】:Semantic Duplicate rows in inner join same table [PostgreSQL]内部连接同一表中的语义重复行 [PostgreSQL]
【发布时间】:2021-03-15 12:38:48
【问题描述】:

我想将我的表与自身连接以检查在特定列上具有相似值的行,但我想删除隐式重复行,即通过执行以下查询:

SELECT a1.id, a2.id
FROM table_1 a1 
JOIN table_1 a2 
ON a1.column_x = a2.column_x 
AND a1.id <> a2.id ;

我得到了:

 id | id
----+-----
 28 | 27
 27 | 28
 47 | 48
 48 | 47
...

我想要得到的是:

 id | id
----+-----
 28 | 27
 47 | 48

请问我该如何实现?

【问题讨论】:

  • AND a1.id &gt; a2.i
  • 如果有 (33, 34) 行但没有 (34, 33) 行,预期结果是什么?
  • 是的,我也应该显示 (33, 34)
  • 接受的答案不会返回 (33, 34)。
  • 我没有这种情况。全部重复!

标签: sql postgresql join


【解决方案1】:

使用&gt;&lt; 而不是&lt;&gt;

SELECT a1.id, a2.id
FROM table_1 a1 JOIN
     table_1 a2 
     ON a1.column_x = a2.column_x AND
        a1.id > a2.id ;

【讨论】:

    【解决方案2】:

    使用LEAST()GREATEST() 函数始终在第一列中返回较小的值,在第二列中返回较大的值。使用SELECT DISTINCT 避免重复。

    也将返回“单独”行,例如,如果有 (33, 34) 行,但没有 (34, 33) 行。

    SELECT DISTINCT least(a1.id, a2.id), greatest(a1.id, a2.id)
    FROM table_1 a1 
    JOIN table_1 a2 
        ON a1.column_x = a2.column_x 
       AND a1.id <> a2.id ;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-18
      • 2018-01-07
      • 2016-03-14
      • 1970-01-01
      • 2018-06-14
      • 2020-11-05
      相关资源
      最近更新 更多