[英]How to display similar rows once for SQL left join on same table
假設我的 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 為 null:
document_id|user_id1|user_id2|
-----------|--------|--------|
100|10 |20 |
100|20 | |
200|10 |20 |
200|20 | |
300|10 |20 |
300|20 | |
@jarlh 的評論可能是 go 的一種方式,但另一種方式是 select 使用最小/最大區別:
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;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.