Postgresql: interogare două tabele cu același nume de coloană și arată rezultatul alături de comandat lor nume de coloane, care apar în ambele tabele

0

Problema

Având două tabele (tabelul 1, tabelul 2) cu același nume de coloană (generație, părinte), rezultatul dorit va fi o combinație de toate coloanele din ambele tabele. Astfel, rândurile din tabelul 2 ar trebui să se alăture tabelul 1 , astfel încât rândurile din tabelul 2 se potrivesc cu cele din tabelul 1 pe generație coloana. Părintele număr ar trebui să fie ordonat crescător pentru înregistrările din tabelul 1 , precum și în tabelul 2. Numărul de rânduri de rezultate de interogare ar trebui să fie egale cu cele din tabelul 1.

Având în tabelele de mai jos
tabelul 1:

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

tabelul 2:

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

Următoarele întrebări sunt de gând pentru crearea și popularea două eșantioane tabelele prezentate mai sus:

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

imaginat de interogare ar trebui să conducă la următoarele rezultatul dorit:

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

Interogarea curentă arată după cum urmează:

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;

Care conduce la următorul rezultat:

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

Acest link a condus la concluzia, că orice se alăture comanda nu s-ar putea ceea ce este necesar aici ... Dar uniunea nu doar adăugați rânduri... asa ca pentru mine este absolut clar, cum rezultatul dorit poate fi atins o.O
Orice ajutor este apreciat. Multumesc anticipat!

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

Cel mai bun răspuns

1

Principala neînțelegere cu privire la această întrebare a apărut din faptul că ai menționat se alăture, care este un foarte precis definită matematic concept bazat pe produsul Cartezian și poate fi aplicat la orice două seturi. Deci curentul de ieșire este clar. Dar cum ai scris in titlu, doriți să puneți două mese alăturate. Să profite de faptul că au același număr de rânduri (triple).

Acest selectați returnează la ieșire vrei.
Am făcut artificiale se alăture coloane, row_number() OVER (order by generation, parent) as rnumși s-a mutat la al doilea tabel, folosind un adaos de trei. Sper că acest lucru vă ajută să:

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;

Ieșire:

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

În alte limbi

Această pagină este în alte limbi

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