Postgresql: dotazu dvě tabulky se stejnými názvy sloupců a zobrazit výsledek bok po boku nařídil jejich názvy sloupců, které se vyskytují v obou tabulkách

0

Otázka

Mít dvě tabulky (tabulka1, tabulka2) se stejnými názvy sloupců (generace, rodič), požadovaný výstup by to být kombinace všech sloupců z obou tabulek. Čímž řádky tabulka2 by se měly připojit tabulka1 tak, že řádky z tabulka2 jsou stejné jako ty z tabulka1 na generaci sloupci. Rodič číslo by mělo být nařízeno vzestupně pro položky v tabulka1 stejně jako v table2. Počet řádků ve výsledcích dotazu by měla být stejná pro ty z tabulka1.

Vzhledem k tomu následující tabulky
tabulka1:

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

tabulka2:

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

Následující dotazy jsou myšlenka pro vytvoření a vyplnění dva ukázkové tabulky, jak je uvedeno výše:

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

představil si dotaz by měl vést k následujícím požadovaný výsledek:

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

Aktuální dotaz vypadá takto:

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ž vede k následující výsledek:

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

Tento odkaz vedl k závěru, že jakýkoli příkaz připojit nemusí, co je třeba tady ... Ale unie má pouze přidat řádky... takže pro mě je naprosto jasné, jak požadovaného výsledku může být dosaženo o. O
Každá pomoc je velmi vítána. Díky předem!

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

Nejlepší odpověď

1

Hlavní nedorozumění na tuto otázku vyplynula ze skutečnosti, že jste se zmínil připojit, což je velmi přesně matematicky definován koncept založený na Kartézský součin a může být aplikován na jakékoliv dvě sady. Tak aktuální výstup je jasný. Ale jak jste psal v nadpisu, chcete dát dvě tabulky vedle sebe. Můžete využít skutečnosti, že mají stejný počet řádků (trojic).

Tento výběr se vrací na výstup, který chcete.
Udělal jsem umělé připojit sloupce, row_number() OVER (order by generation, parent) as rnum, a přestěhoval se do druhé tabulky pomocí přidání tří. Já doufám, že to pomůž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;

Výstup:

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

V jiných jazycích

Tato stránka je v jiných jazycích

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