Postgresql:쿼리를 두 테이블과 같은 열 이름을 보여주는 결과 측면에서 주문하는 그들의 열 이름에서 발생하는 모두의 테이블

0

질문

두 가지는 테이블(table1, table2)같은 열 이름을(생성, 부모),원하는 출력이 될 것이 조합의 모든의 열 두 테이블이 있습니다. 함으로써의 행 table2 에 가입해야 table1 그래서는 그의 행 table2 은 일치하는 사람들의 table1 에서 차세대 열입니다. 부모 번호를 주문해야 합 오름차순으로 항목에 대한 table1 에서뿐만 아니라 table2. 의 행 수를 쿼리의 결과 동일해야의 그의 table1.

다음과 같은 테이블
table1:

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

table2:

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

다음과 같은 쿼리는 생각을 만들고 채우기 위한 두 개의 샘플 테이블과 같은 위의:

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

상상 쿼리도해야하는 다음과 같은 원하는 결과:

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

현재 쿼리의 모양은 다음과 같습니다.

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;

에 이르는 다음과 같은 결과를 얻을 수 있습니다

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

이 링크를 주도하는 결론에는 어떤 가입하세 명령하지 않을 수 있습 무엇이 필요 여기...그러나 유니온은 행 추가...그래서 나를 위해 절대적으로 불명확하 어떻게 원하는 결과를 얻을 수 있습니다.O
어떤 도움을 높게 평가됩니다. 사전에 감사합니다!

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

최고의 응답

1

메인 오해는 이 질문에는 사실에서 비롯 당신은 언급 가입하세는 매우 정확하게 수학적으로 정의 개념에 기초 데카르트 제품에 적용될 수 있습니다.두 가지 설정합니다. 그래서 현재 출력은 명확하다. 그러나 당신이 그랬던 것처럼 제목에서,당신은 두 테이블 옆에. 를 활용하는 사실 그들은 같은 수의 행이(트리플).

이 선택 반환 출력을 원합니다.
내가 만든 인공적인 참여 열, row_number() OVER (order by generation, parent) as rnum로 두 번째 테이블을 사용하여 추가의 세 가지입니다. 내가 당신을 도움이되기를 바랍:

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;

출력:

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

다른 언어로

이 페이지는 다른 언어로되어 있습니다

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