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

insert into changes
select 
daily2.id_registro 
from daily2 
inner join 
daily on daily2.id_registro = daily.id_registro
where
daily2.fecha_ingreso!=daily.fecha_ingreso
or
daily2.fecha_sintomas!=daily.fecha_sintomas
or
daily2.fecha_def!=daily.fecha_def
or
daily2.intubado!=daily.intubado
or
daily2.neumonia!=daily.neumonia
or
daily2.diabetes!=daily.diabetes
or
daily2.epoc!=daily.epoc
or
daily2.asma!=daily.asma
or
daily2.inmusupr!=daily.inmusupr
or
daily2.hipertension!=daily.hipertension
or
daily2.otra_com!=daily.otra_com
or
daily2.cardiovascular!=daily.cardiovascular
or
daily2.obesidad!=daily.obesidad
or
daily2.renal_cronica!=daily.renal_cronica
or
daily2.tabaquismo!=daily.tabaquismo
or
daily2.otro_caso!=daily.otro_caso
or
daily2.resultado!=daily.resultado
0
Carlos Espinoza Garcia 2 Сен 2020 в 23:50

2 ответа

Лучший ответ

Если вы знаете, что у каждого идентификатора есть совпадение, вы можете просто:

insert into changes
select id_registro from 
(
    select * from daily2 
    except
    select * from daily
) as a

Таким образом, вам не нужно писать каждый столбец.

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

insert into changes
select id_registro from 
(
    select * from daily2 
    except
    select * from daily
) as a
where a.id_registro in
(
    select daily2.id_registro
    from daily inner join daily2
    on daily.id_registro = daily2.id_registro 
);

Это довольно тяжело, поэтому будьте осторожны за гигантскими столами.

1
user_0 2 Сен 2020 в 21:19

Вы хотите равенство кортежей (в)?

where
    (daily2.fecha_ingreso, daily2.fecha_sintomas, daily2.fecha_def, ...) 
    <> (daily.fecha_ingreso, daily.fecha_sintomas, daily.fecha_def, ...)

Интересно, можно ли было бы более эффективно сформулировать этот запрос с помощью exists:

insert into changes (id_registro)
select d2.id_registro 
from daily2 d2
where exists (
    select 1
    from daily d
    where 
        d1.id_registro = d.id_registro
        and (d2.fecha_ingreso, d2.fecha_sintomas, d2.fecha_def, ...) 
         <> (d.fecha_ingreso, d.fecha_sintomas, d.fecha_def, ...)
)
1
GMB 2 Сен 2020 в 21:05