Eu tenho duas tabelas, "hierarchy_table" e "name_table".
A tabela de hierarquia contém um objeto que tem vários pais e filhos. Cada pai e filho é referenciado por id.
| object_id | parent_id_1 | parent_id_2 | child_id_1 | child_id_2 |
-----------------------------------------------------------------------------
| 1234 | 9999 | 9567 | 5555 | 5556 |
-----------------------------------------------------------------------------
Cada id de objeto na hierarquia_tabela tem uma entrada na tabela_nome:
| name_id | name |
--------------------------
| 1234 | ABCD |
--------------------------
| 9999 | ZYXW |
--------------------------
| ...
Como faço para unir cada id na hierarquia_table à name_table várias vezes para que eu possa ter um resultado em que todos os nomes sejam preenchidos?
Assim:
| object | parent_1 | parent_2 | child_1 | child_2 |
-----------------------------------------------------------------------------
| ABCD | ZYXW | BBBB | CCCC | DDDD |
-----------------------------------------------------------------------------
Nota: os nomes das tabelas no exemplo são apenas para clareza/simplicidade, os nomes reais têm nomes próprios.
O
hierarchy_table
tem 5 colunas que fazem referência aoname_table
, então você precisa de 5 junções. Pode ser melhor usarLEFT
joins em vez deINNER
, caso algumas dessas colunas sejam anuláveis e você ainda queira que as linhas sejam retornadas:Você pode usar o nome do alias para tabelas envolvidas na consulta.
TL&DR: Alias deve ser usado quando você deseja ingressar na mesma tabela várias vezes
Racional:
No Postgres, normalmente as pessoas unem uma coluna em uma tabela a outra coluna em uma tabela diferente. Isso foi brilhante do ponto de vista do design como o caso de uso normal. Quando você quiser unir colunas adicionais, precisará usar aliases (prática recomendada).
COMO:
Ao executar um INNER JOIN, certifique-se de adicionar uma cláusula AS junto com o nome.
Exemplo
Se você notar que a resposta 'aceita' faz isso acima.