Como exibir linhas semelhantes uma vez para junção à esquerda do SQL na mesma tabela

Desmond27

Digamos que eu tenha a seguinte tabela em meu banco de dados 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|

Agora eu uno esta tabela a ela mesma na coluna document_id da seguinte maneira:

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);

O resultado:

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      |

Aqui, desejo remover linhas semelhantes, como a que está abaixo, porque os dois registros significam a mesma coisa:

document_id|user_id1|user_id2|
-----------|--------|--------|
        100|10      |20      |
        100|20      |10      |

Portanto, o resultado esperado deve ser semelhante a:

document_id|user_id1|user_id2|
-----------|--------|--------|
        100|10      |20      |
        200|10      |20      |
        300|10      |20      |
        400|10      |20      |

Portanto, basicamente, exijo que o document_id apareça uma vez, em vez de duas. Existe alguma maneira de fazer isso?

Editar:

Tentei a seguinte consulta, conforme sugerido por @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);

Mas o resultado é que user_id2 é nulo quando user_id1 é maior dos dois:

document_id|user_id1|user_id2|
-----------|--------|--------|
        100|10      |20      |
        100|20      |        |
        200|10      |20      |
        200|20      |        |
        300|10      |20      |
        300|20      |        |
Tim Biegeleisen

O comentário de @jarlh pode ser uma maneira de ir aqui, mas outra maneira seria selecionar distinto usando menor / maior:

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;

Este artigo é coletado da Internet.

Se houver alguma infração, entre em [email protected] Delete.

editar em
0

deixe-me dizer algumas palavras

0comentários
loginDepois de participar da revisão

Artigos relacionados

Junção à esquerda na mesma tabela SQL

SQL - tabela de junção esquerda para si mesma

Linhas de junção esquerda e linhas da tabela direita na mesma coluna

SQL - Como colocar uma condição para a qual a tabela é selecionada sem junção à esquerda

Como exibir o número de linhas na tabela SQL para um contêiner HTML

junção à esquerda para registro anterior na mesma tabela com base na coluna datetime

Como eu faria para exibir uma tabela do SQL com PHP AZ onde, após 10 linhas, o script inicia uma nova tabela ao lado dele

Como faço para parar de linhas duplicadas na junção de tabela no SQL?

SQL - Transposição de linhas de algumas colunas em uma tabela para cada registro na mesma tabela

Como exibir o total de valores na mesma tabela como uma linha (na instrução case)?

Como exibir registros da consulta selecionada com junção à esquerda na tabela usando foreach?

Como obter o conteúdo de uma tabela com base na junção à esquerda em duas outras tabelas

MySQL junção à esquerda na mesma tabela, resultado duplo invertido

Como contar as linhas que faltam na tabela à esquerda após a junção à direita?

Qual junção eu desejo usar para obter linhas da tabela esquerda que não foram encontradas na tabela direita no SQL Server

Como faço para exibir a imagem na coluna da direita em uma tabela sql?

Como faço para exibir uma imagem na esquerda do material-UI AppBar, mas reter o menu "hambúrguer"?

Divida muitos para muitos com propriedades na tabela de junção, como exibir uma lista de objetos com colunas da tabela de junção

SQL - atualiza várias linhas de uma vez com valores de várias outras linhas na mesma tabela

Como faço para usar subconsultas em uma junção à esquerda como uma tabela

Como faço para usar subconsultas em uma junção à esquerda como uma tabela

Como escrever uma consulta SQL para obter o nome do emp e o nome do gerente que estão na mesma tabela?

Como usar colunas da tabela à esquerda na cláusula where na instrução de seleção à direita na instrução de junção do SQL Server

Sequenciar: como fazer uma condição WHERE na tabela unida com a junção externa esquerda

Contar um para muitos usando a junção à esquerda fornece uma contagem errada na tabela de origem

Como tirar n linhas de dados de uma tabela referenciando dados de uma coluna na mesma tabela? (SQL)

Mostrar valores duplicados na junção externa esquerda uma vez

Como comparar linhas na mesma tabela com a linha padrão de cada uma?

junção à esquerda com até uma linha na tabela à direita no LINQ