Postgresql: dotaz dve tabuľky s rovnakou názvy stĺpcov a zobraziť výsledok po boku nariadil ich názvy stĺpcov, ktoré sa vyskytujú v oboch tabuľkách

0

Otázka

Majú dve tabuľky (tab.1, tab. č.: 2) rovnaké názvy stĺpcov (generácie, materskej), požadovaný výstup by byť kombinácia všetky stĺpce z oboch tabuliek. Čím riadky tab. č.: 2 by sa mali pripojiť tabuľka1 tak, aby riadky tab. č.: 2 sú zodpovedajúce tých tabuľka1 na generáciu stĺpci. Materská počet by mal byť zoradené vzostupne pre záznamy v tab.1 , rovnako ako v tab. č.: 2. Počet riadkov dotaz výsledky by mali byť rovnaké tých tabuľka1.

Vzhľadom na nasledujúcich tabuľkách
tabuľka1:

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

tab. č.: 2:

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

Nasledujúce otázky sú si myslel, pre vytvorenie a vyplnenie dve vzorky tabuľky, ako je uvedené vyššie:

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

predstavou dotaz by mal viesť k nasledujúce požadovaný výsledok:

| 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álny dopyt vyzerá 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;

Čo vedie k nasledujúcim výsledkom:

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

Toto spojenie viedlo k záveru, že akékoľvek pripojiť príkaz možno nie, čo je potrebné tu ... Ale únie sa len pridať riadky... takže pre mňa je absolútne nejasné, ako sa požadovaný výsledok môže byť dosiahnutý o.O
Každá pomoc je vysoko cenený. Vďaka vopred!

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

Najlepšiu odpoveď

1

Hlavné nedorozumenie na túto otázku vznikol z toho, že ste spomenuli, pripojiť, čo je veľmi presne matematicky definovaný koncept založený na Karteziánske výrobku a môže byť aplikovaný na akýkoľvek dve sady. Takže výstupný prúd je jasné. Ale ako si napísal názov, ktorý chcete dať dva stoly vedľa seba. Môžete využiť k tomu, že majú rovnaký počet riadkov (trojlôžkových).

Tento vyberte vracia výstup chcete.
Urobil som umelé pripojiť stĺpce, row_number() OVER (order by generation, parent) as rnuma presťahoval sa na druhú tabuľku s použitím okrem troch. Dúfam, že vám 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 iných jazykoch

Táto stránka je v iných jazykoch

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