簡體   English   中英

如何在同一張表上為 SQL 左連接顯示一次相似的行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM