Postgresql: запросите две таблицы с одинаковыми именами столбцов и покажите результат рядом с их именами столбцов, которые встречаются в обеих таблицах

0

Вопрос

Имея две таблицы (табл.1, табл. 2) с одинаковыми именами столбцов (поколение, родитель), желаемым результатом будет комбинация всех столбцов обеих таблиц. Таким образом, строки таблицы 2 должны присоединиться к таблице 1, чтобы строки таблицы 2 соответствовали строкам таблицы 1 в столбце генерации. Родительский номер должен быть упорядочен по возрастанию для записей в таблице 1, а также в таблице 2. Количество строк результатов запроса должно быть равно числу строк таблицы 1.

Приведены следующие таблицы
таблица 1:

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

таблица 2:

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

Эта ссылка привела к выводу, что любая команда join может оказаться не тем, что здесь необходимо ... Но объединение только добавляет строки... поэтому для меня абсолютно непонятно, как можно достичь желаемого результата о. О.
Любая помощь будет высоко оценена. Заранее спасибо!

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

Лучший ответ

1

Основное недопонимание по этому вопросу возникло из-за того, что вы упомянули join, который является очень точно математически определенной концепцией, основанной на декартовом произведении и может быть применен к любым двум наборам. Таким образом, текущий выход ясен. Но, как вы написали в названии, вы хотите поставить две таблицы рядом. Вы пользуетесь тем, что у них одинаковое количество строк (троек).

Этот выбор возвращает желаемый результат.
Я сделал искусственные соединительные колонны, 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;

Выход:

таблица 1_генерация таблица 1_parent таблица 2_генерация 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
2021-11-25 21:38:39

На других языках

Эта страница на других языках

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