2016-08-10 1 views
0

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

Это то, что я пытался с:

WITH moved_rows AS (
    DELETE FROM rac_temp_import 
    WHERE depo IN ('0281752') AND tura IN ('026','094','097') 
    RETURNING *, (CASE WHEN parcelno IN(
     SELECT parcelno FROM rac_import 
     UNION 
     SELECT parcelno FROM rac_dupli 
    ) THEN true ELSE false END) AS dupli 
) 
INSERT INTO rac_dupli 
SELECT FROM moved_rows WHERE dupli = true 
INSERT INTO rac_import 
SELECT FROM moved_row WHERE dupli = false 

Но, насколько я понимаю, только один INSERT оператора может существовать после WITH и я попытался с помощью CASE после, но это не сработало.

+0

Используйте таблицу (темп) вместо КТР. Или преобразовать CTE в (temp). – wildplasser

+0

Вам не нужно сначала установить флаг, а затем использовать его; вы можете перенести условия exist() на вставку в части {rac_dupl, rac_import}, где они принадлежат. – wildplasser

ответ

0

Сделайте первый insert КТР:

with moved_rows as (
    delete from rac_temp_import rti 
    where depo in ('0281752') and tura in ('026','094','097') 
    returning *, 
     exists (
      select parcelno 
      from rac_import 
      where parcelno = rti.parcelno 
     ) or 
     exists (
      select parcelno 
      from rac_dupli 
      where parcelno = rti.parcelno 
     ) as dupli 
), i as (
    insert into rac_dupli 
    select 
    from moved_rows 
    where dupli = true 
) 
insert into rac_import 
select 
from moved_rows 
where dupli = false 

exists может быть быстрее, чем case in

+0

Да, именно это я и искал. –

Смежные вопросы