如何在同一个表上为SQL左联接显示一次类似的行
假设我的postgresql数据库中有下表:如何在同一个表上为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 |
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.用户标识;
Douser\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;