Postgresql: eseguire una query su due tabelle con gli stessi nomi di colonna e mostrare il risultato a fianco ordinato i loro nomi di colonna, che si verificano in entrambe le tabelle

0

Domanda

Avere due tabelle (tabella1, tabella2) con lo stesso nome colonna (generazione, genitore), l'output desiderato sarebbe la combinazione di tutte le colonne di entrambe le tabelle. In tal modo le righe di tabella2 dovrebbero unirsi tabella1 in modo che le righe di tabella2 sono corrispondenti a quelli della tabella 1 sulla generazione di colonne. Il genitore numero dovrebbe essere ordinati in ordine crescente per le voci in tabella1, così come in tabella2. Il numero di righe della query i risultati dovrebbero essere uguali a quelli di table1.

Date le seguenti tabelle
tabella1:

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

tabella2:

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

La query riportata di seguito sono pensato per la creazione e la compilazione di due tabelle di esempio, come mostrato sopra:

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

immaginato query dovrebbe portare il seguente risultato desiderato:

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

Query corrente si presenta come 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;

Che porta al seguente risultato:

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

Questo link ha portato alla conclusione che qualsiasi comando join potrebbe non ciò che è necessario qui ... Ma l'unione fa solo aggiungere righe... quindi per me è assolutamente chiaro, come il risultato desiderato può essere raggiunto o.O
Qualsiasi aiuto è molto apprezzato. Grazie in anticipo!

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

Migliore risposta

1

Il principale equivoco su questa questione è nata dal fatto che hai citato join, che è un modo molto preciso e definito matematicamente il concetto Cartesiano prodotto e può essere applicato a qualsiasi due set. In modo che la corrente di uscita è chiaro. Ma come hai scritto nel titolo, vuoi mettere due tabelle a fianco. Si sfrutta il fatto che hanno lo stesso numero di righe (triple).

Questa select restituisce l'output desiderato.
Ho fatto artificiali colonne di join, row_number() OVER (order by generation, parent) as rnume spostata la seconda tabella tramite l'aggiunta di tre. Spero che questo ti aiuta:

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;

Output:

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

In altre lingue

Questa pagina è in altre lingue

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