Postgresql: consulta de duas tabelas com os mesmos nomes de colunas e mostra o resultado, lado a lado, ordenou que seus nomes de coluna, que ocorrem em ambas as tabelas

0

Pergunta

Ter duas tabelas (tabela1, tabela2) com os mesmos nomes de colunas (geração, de pai), a saída desejada seria a combinação de todas as colunas das duas tabelas. Assim, as linhas de tabela2 deve juntar-se a tabela 1 , de forma que as linhas de tabela2 são semelhantes às dos tabela1 na geração de colunas. O pai número deve ser ordenada em ordem crescente para as entradas na tabela 1 , bem como na tabela2. O número de linhas dos resultados da consulta deve ser igual aqueles da tabela1.

Dadas as seguintes tabelas
tabela1:

| generation | parent |
|:----------:|:------:|
| 0          | 1      |
| 0          | 2      |
| 0          | 3      |
| 1          | 3      |
| 1          | 2      |
| 1          | 1      |
| 2          | 2      |
| 2          | 1      |
| 2          | 3      |

tabela2:

| generation | parent |
|:----------:|:------:|
| 1          | 3      |
| 1          | 1      |
| 1          | 3      |
| 2          | 1      |
| 2          | 2      |
| 2          | 3      |

As seguintes consultas são pensados para a criação e o preenchimento de duas tabelas de exemplo, como mostrado acima:

create table table1(generation integer, parent integer);
insert into table1 (generation, parent) values(0,1),(0,2),(0,3),(1,3),(1,2),(1,1),(2,2),(2,1),(2,3);
create table table2(generation integer, parent integer);
insert into table2 (generation, parent) values(1,3),(1,1),(1,3),(2,1),(2,2),(2,3);

o imaginado consulta deve levar ao seguinte resultado desejado:

| table1_generation | table1_parent | table2_generation | table2_parent |
|:-----------------:|:-------------:|:-----------------:|:-------------:|
| 0                 | 1             |                   |               |
| 0                 | 2             |                   |               |
| 0                 | 3             |                   |               |
| 1                 | 1             | 1                 | 1             |
| 1                 | 2             | 1                 | 3             |
| 1                 | 3             | 1                 | 3             |
| 2                 | 1             | 2                 | 1             |
| 2                 | 2             | 2                 | 2             |
| 2                 | 3             | 2                 | 3             |

Consulta atual, parece como se segue:

with 
  p as (
    select 
      generation,
      parent 
    from 
      table1
    order by
      generation,
      parent
  ), o as(
    select
      generation,
      parent 
    from 
      table2 
    order by
      generation,
      parent
  )
select
  p.generation as table1_generation,
  p.parent as table1_parent,
  o.generation as table2_generation,
  o.parent as table2_parent
from
  p
left join o on 
  o.generation=p.generation;

O que leva ao seguinte resultado:

| table1_generation | table1_parent | table2_generation | table2_parent |
|:-----------------:|:-------------:|:-----------------:|:-------------:|
| 0                 | 1             |                   |               |
| 0                 | 2             |                   |               |
| 0                 | 3             |                   |               |
| 1                 | 1             | 1                 | 1             |
| 1                 | 1             | 1                 | 3             |
| 1                 | 1             | 1                 | 3             |
| 1                 | 2             | 1                 | 1             |
| 1                 | 2             | 1                 | 3             |
| 1                 | 2             | 1                 | 3             |
| 1                 | 3             | 1                 | 1             |
| 1                 | 3             | 1                 | 3             |
| 1                 | 3             | 1                 | 3             |
| 2                 | 1             | 2                 | 1             |
| 2                 | 1             | 2                 | 2             |
| 2                 | 1             | 2                 | 3             |
| 2                 | 2             | 2                 | 1             |
| 2                 | 2             | 2                 | 2             |
| 2                 | 2             | 2                 | 3             |
| 2                 | 3             | 2                 | 1             |
| 2                 | 3             | 2                 | 2             |
| 2                 | 3             | 2                 | 3             |

Este link leva a conclusão de que qualquer comando join pode não o que é necessário aqui ... Mas a união faz apenas acrescentar linhas... então, para mim, é absolutamente claro, como o resultado desejado pode ser alcançado o.O
Qualquer ajuda é muito apreciada. Obrigado antecipadamente!

join postgresql
2021-11-23 22:52:10
1

Melhor resposta

1

O principal mal-entendido sobre esta questão surgiu a partir do fato de que você mencionou associação, o que é muito precisamente definida matematicamente, conceito que se baseia no produto Cartesiano e pode ser aplicado para quaisquer dois conjuntos. Assim, a corrente de saída é clara. Mas, como você escreveu no título, você quer colocar duas mesas lado a lado. Você tirar proveito do fato de que eles têm o mesmo número de linhas (triplos).

Este select retorna a saída que você deseja.
Eu fiz artificial colunas de associação, row_number() OVER (order by generation, parent) as rnume mudou-se com a segunda tabela usando a adição de três. Espero que isso ajude você:

with 
  p as (
    select 
      row_number() OVER (order by generation, parent) as rnum,
      generation,
      parent 
    from 
      table1
    order by
      generation,
      parent
  ), o as(
    select
      row_number() OVER (order by generation, parent) as rnum,
      generation,
      parent 
    from 
      table2 
    order by
      generation,
      parent
  )
select
  p.generation as table1_generation,
  p.parent as table1_parent,
  o.generation as table2_generation,
  o.parent as table2_parent
from
  p
left join o on 
  o.rnum+3=p.rnum
order by 1,2,3,4;

Saída:

table1_generation table1_parent table2_generation table2_parent
0 1 (null) (null)
0 2 (null) (null)
0 3 (null) (null)
1 1 1 1
1 2 1 3
1 3 1 3
2 1 2 1
2 2 2 2
2 3 2 3
2021-11-25 21:38:39

Em outros idiomas

Esta página está em outros idiomas

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
ไทย
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................