Postgresql: poproś o dwie tabele o tej samej nazwie kolumn i pokaż wynik obok ich nazw kolumn, które występują w obu tabelach

0

Pytanie

Mając dwie tabele (tabela.1, tabl. 2) z takimi samymi nazwami kolumn (pokolenie, rodzic), pożądanym rezultatem będzie połączenie wszystkich kolumnach obu tabel. W ten sposób, wiersze tabeli 2 należy dołączyć do tabeli 1, aby wiersza tabeli 2 zgodne z wierszy tabeli 1 w kolumnie generacji. Nadrzędny numer musi być posortowana rosnąco dla rekordów w tabeli 1 oraz w tabeli 2. Liczba wierszy wyników zapytania musi być równa liczbie wierszy w tabeli 1.

Przedstawiono następujące tabele
tabela 1:

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

tabela 2:

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

Następujące wnioski są przeznaczone do tworzenia i wypełniania dwóch przykładowych tabel, jak pokazano powyżej:

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

wyimaginowany wniosek musi prowadzić do następnego pożądanego wyniku:

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

Aktualny zapytanie wygląda następująco:

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;

Co prowadzi do następującego wyniku:

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

Ten link doprowadziła do wniosku, że każda drużyna join może okazać się nie tym, że tutaj trzeba ... Ale łączenie tylko dodaje wiersze... więc dla mnie absolutnie niezrozumiałe, jak można osiągnąć pożądany rezultat o. o.
Każda pomoc będzie doceniona. Z góry dziękuję!

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

Najlepsza odpowiedź

1

Podstawowe nieporozumienie w tej sprawie powstało z powodu tego, że wspomniałeś join, który jest bardzo dokładnie matematycznie określonej koncepcji, opartej na декартовом dziele i może być stosowany do dowolnych dwóch zestawów. W ten sposób bieżący wyjście jest jasne. Ale, jak napisałeś w tytule, chcesz umieścić dwie tabeli obok. Korzystasz z tym, że u nich taką samą liczbę wierszy (trójek).

Wybór ten zwraca pożądany wynik.
Zrobiłem sztuczne łączące kolumny, row_number() OVER (order by generation, parent) as rnumi przeniósł drugą tabelę, stosując dodawanie trzech. Mam nadzieję, że to pomoże:

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;

Wyjście:

tabela 1_генерация tabela 1_parent tabela 2_генерация table2_parent
0 1 (zero) (zero)
0 2 (zero) (zero)
0 3 (zero) (zero)
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

W innych językach

Ta strona jest w innych językach

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