Postgres: запрос с несколькими (частично) перекрывающимися источниками данных

У меня есть несколько источников данных (на данный момент 4, теоретически может увеличиться в будущем), поступающих в несколько таблиц PostgreSQL, и я хотел бы создать представление, сравнивающее разные источники для каждой записи. К сожалению, не все записи отображаются в каждой таблице.

В настоящее время запрос, который я использую, отформатирован следующим образом

select [relevant_fields] from ((tableA full outer join tableB on 
    tableA.id=tableB.id) full outer join tableC on tableA.id=tableC.id)
    full outer join tableD on tableD.id=tableA.id 

Проблема с этим запросом заключается в том, что если запись находится в таблицах B, C и D, но не в таблице A, она превращается в 3 (в основном нулевые) строки, по одной для каждого источника данных. Я понимаю, что есть способ сделать это путем добавления во вторичную таблицу, но мне было интересно, есть ли способ сделать это непосредственно в select/view, поскольку некоторые из этих таблиц довольно большие и будут только увеличиваться, и я бы предпочел не столкнуться с проблемой памяти в будущем, потому что у меня хранится несколько копий каждой записи.

Итак, мой вопрос: есть ли способ структурировать соединения, чтобы выполнить 1 (как можно более заполненную) строку для каждой записи в выборе/представлении?

Редактировать, Пример данных:

Table A
id | value
1  | a
2  | b
3  | c

Table B
id | value
1  | A
3  | Z

Table C
id | value
1  | Q
4  | D

Table D
id | value
1  | a
3  | C

Result
id | val_A | val_B | val_C | val_D
1  |  a    |  A    |  Q    |  a  
2  |  b    |  null |  null |  null
3  |  c    |  Z    |  null |  C
4  |  null |  null |  D    |  null

person Jarl Zarl    schedule 11.07.2017    source источник
comment
Пожалуйста, отредактируйте свой вопрос и добавьте несколько примеров данных и ожидаемый результат на основе этих данных. Отформатированный текст, пожалуйста, нет снимков экрана. отредактируйте свой вопрос - не размещайте код или дополнительную информацию в Комментарии.   -  person a_horse_with_no_name    schedule 11.07.2017


Ответы (1)


Ваш пример запроса может быть упрощен:

select [relevant_fields]
from
  tableA full join 
  tableB using(id) full join
  tableC using(id) full join
  tableD using(id);

И это должно работать так, как вы хотите.

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

select [relevant_fields]
from
  tableA as tableA(i,val_a) full join 
  tableB as tableB(i,val_b) using(i) full join
  tableC as tableC(i,val_c) using(i) full join
  tableD as tableD(i,val_d) using(i);

И он также выдает желаемые имена столбцов val_*.

Пример

Прочитайте о предложении USING здесь.

person Abelisto    schedule 11.07.2017
comment
Кажется, работает отлично, раньше не сталкивался с ИСПОЛЬЗОВАНИЕМ, спасибо! - person Jarl Zarl; 11.07.2017