首页 > 解决方案 > 如何为同一张表上的 SQL 左连接显示一次相似的行

问题描述

假设我的 postgresql 数据库中有下表:

id|user_id|document_id|
--|-------|-----------|
 1|10     |        100|
 2|20     |        100|
 3|10     |        200|
 4|20     |        200|
 5|10     |        300|
 6|20     |        300|
 7|10     |        400|
 8|20     |        400|

我现在在列 document_id 上将这个表与自身连接起来,如下所示:

select t1.document_id, t1.user_id as user_id1, t2.user_id as user_id2
from test_table t1 left join test_table t2 on (t1.document_id = t2.document_id and t1.user_id <> t2.user_id);

结果:

document_id|user_id1|user_id2|
-----------|--------|--------|
        100|10      |20      |
        100|20      |10      |
        200|10      |20      |
        200|20      |10      |
        300|10      |20      |
        300|20      |10      |
        400|10      |20      |
        400|20      |10      |

在这里,我想删除类似的行,例如下面的行,因为两条记录的含义相同:

document_id|user_id1|user_id2|
-----------|--------|--------|
        100|10      |20      |
        100|20      |10      |

因此,预期结果应如下所示:

document_id|user_id1|user_id2|
-----------|--------|--------|
        100|10      |20      |
        200|10      |20      |
        300|10      |20      |
        400|10      |20      |

所以我基本上要求 document_id 出现一次而不是两次。有什么办法吗?

编辑:

我按照@jarlh 的建议尝试了以下查询:

select t1.document_id, t1.user_id as user_id1, t2.user_id as user_id2
from test_table t1 left join test_table t2 on (t1.document_id = t2.document_id and t1.user_id < t2.user_id);

但结果是当 user_id1 大于两者时 user_id2 为空:

document_id|user_id1|user_id2|
-----------|--------|--------|
        100|10      |20      |
        100|20      |        |
        200|10      |20      |
        200|20      |        |
        300|10      |20      |
        300|20      |        |

标签: sqlpostgresql

解决方案


@jarlh 的评论可能是这里的一种方式,但另一种方式是使用最小/最大选择不同的:

select distinct
    t1.document_id,
    least(t1.user_id, t2.user_id) as user_id1,
    greatest(t1.user_id, t2.user_id) as user_id2
from test_table t1
left join test_table t2
    on t1.document_id = t2.document_id and
       t1.user_id <> t2.user_id;

推荐阅读