如何在同一个表上为SQL左联接显示一次类似的行

如何在同一个表上为SQL左联接显示一次类似的行,sql,postgresql,Sql,Postgresql,假设我的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 |

假设我的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      |
因此,预期结果应该如下所示:

document_id|user_id1|user_id2|
-----------|--------|--------|
        100|10      |20      |
        200|10      |20      |
        300|10      |20      |
        400|10      |20      |
所以我基本上要求文档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);

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

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;
选择distinct
t1.文件标识,
最少(t1.user\U id,t2.user\U id)为user\U id1,
最大(t1.user\u id,t2.user\u id)作为user\u id 2
来自测试_表t1
左连接测试表t2
在t1.document\u id=t2.document\u id和
t1.用户标识t2.用户标识;

Do
user\u id1
。好的,我试过了,但是现在我得到了user\u id2的空值,其中user\u id1是两者中的较大者。编辑:用输出更新OP。我没有注意到左连接。简单地尝试一个常规的内部连接。顺便说一句,也许你应该将行(7,10400)和(8,20,100)添加到样本数据中,并相应地调整预期结果。哦,是的,我真傻。现在应该是空的。我使用左连接,因为这实际上是一个较大表的子集,我需要左连接来跟踪一些不匹配的值。
document_id|user_id1|user_id2|
-----------|--------|--------|
        100|10      |20      |
        100|20      |        |
        200|10      |20      |
        200|20      |        |
        300|10      |20      |
        300|20      |        |
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;