sql - 如何为同一张表上的 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 | |
解决方案
@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;