Postgres создать таблицу как из нескольких соединений


У меня есть проблема с датаминированием с очень большим количеством атрибутов (>15 000). Я представляю данные в нескольких таблицах с общим полем Id. Удалив пустые атрибуты, я хочу объединить полученные меньшие таблицы, чтобы вычислить корреляции для удаления избыточных атрибутов.
Я могу легко присоединиться к таблицам с помощью:

select * from lrg_bin0 k0
  join lrg_bin1 k1 on k0.id = k1.id
  join lrg_bin2 k2 on k0.id = k2.id
  join lrg_bin3 k3 on k0.id = k3.id

Но когда я пытаюсь создать новую таблицу с:

Create table mrg0 as (
  select * from lrg_bin0 k0
    join lrg_bin1 k1 on k0.id = k1.id
    join lrg_bin2 k2 on k0.id = k2.id
    join lrg_bin3 k3 on k0.id = k3.id
) 

Postgress жалуется, что "столбец" id "указан более одного раза"

Тот самый большое количество атрибутов означает, что я делаю все программно, поэтому ответы на запросы, которые я могу генерировать, будут оценены.

2 2

2 ответа:

Используйте using вместо on

create table mrg0 as 
select *
from
    lrg_bin0 k0
    join lrg_bin1 k1 using (id)
    join lrg_bin2 k2 using (id)
    join lrg_bin3 k3 using (id)

Из инструкции :

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

Проблема заключается в том, что в SQL при выполнении соединения с помощью on соответствующий столбец будет включен один раз для каждой таблицы, в которой он находится. Что вы можете сделать, так это указать, в какой таблице вы хотите получить столбец из ala:

Create table mrg0 as (
  select k1.id, ... from lrg_bin0 k0
    join lrg_bin1 k1 on k0.id = k1.id
    join lrg_bin2 k2 on k0.id = k2.id
    join lrg_bin3 k3 on k0.id = k3.id
)