вставка postgresql с несколькими вариантами выбора - PullRequest
0 голосов
/ 11 мая 2018

Если я вставляю одну запись следующим образом:

insert into fund_data 
    (fund_entries_id
     ,fund_val
     ,bbg_pulls_id)
(select fe.id, 1,20
    from
        fund_entries fe
    where
         fe.company_id = 399
        and fe.fiscal_prd_end_date = '2016-09-30')

И вот как вставляю другую запись:

insert into fund_data 
    (fund_entries_id
     ,fund_val
     ,bbg_pulls_id)
(select fe.id, 567,20
    from
        fund_entries fe
    where
         fe.company_id = 5
        and fe.fiscal_prd_end_date = '2016-09-28')

Как вставить их обе в один оператор вставки?Обратите внимание, что на самом деле вставок будет сотни тысяч, а не только две, поэтому эффективность очень важна.

Другими словами, от записи к записи во вставке company_id, fund_val,fiscal_prd_end_date изменить.bbg_pulls_id остается прежним.Но fund_entries_id находится через fiscal_prd_end_date в таблице fund_entries для каждой вставки.

Мои таблицы выглядят так:

CREATE TABLE public.fund_data
(
    id bigint NOT NULL DEFAULT nextval('fund_data_id_seq'::regclass),
    fund_entries_id integer NOT NULL,
    fund_val numeric,
    bbg_pulls_id integer,
    wh_calc_id integer,
    CONSTRAINT fund_data_pkey PRIMARY KEY (id),
    CONSTRAINT fund_data_fund_entries_id_bbg_pulls_id_key UNIQUE (fund_entries_id, bbg_pulls_id),
    CONSTRAINT fund_data_fund_entries_id_wh_calc_id_key UNIQUE (fund_entries_id, wh_calc_id),
    CONSTRAINT fund_data_bbg_pulls_id_fkey FOREIGN KEY (bbg_pulls_id)
        REFERENCES public.bbg_pulls (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT fund_data_fund_entries_id_fkey FOREIGN KEY (fund_entries_id)
        REFERENCES public.fund_entries (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT fund_data_wh_calc_id_fkey FOREIGN KEY (wh_calc_id)
        REFERENCES public.wh_calc (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
        DEFERRABLE,
    CONSTRAINT fund_data_check CHECK ((wh_calc_id IS NULL) <> (bbg_pulls_id IS NULL)),
    CONSTRAINT fund_data_check1 CHECK (NOT (wh_calc_id IS NULL AND fund_val IS NULL))
)

CREATE TABLE public.fund_entries
(
    id integer NOT NULL DEFAULT nextval('fund_entries_id_seq'::regclass),
    fiscal_prd_end_date date NOT NULL,
    company_id integer NOT NULL,
    ern_dt_id integer NOT NULL,
    CONSTRAINT fund_entries_pkey PRIMARY KEY (id),
    CONSTRAINT fund_entries_company_id_fiscal_prd_end_date_key UNIQUE (company_id, fiscal_prd_end_date),
    CONSTRAINT fund_entries_ern_dt_id_key UNIQUE (ern_dt_id),
    CONSTRAINT fund_entries_company_id_fkey FOREIGN KEY (company_id)
        REFERENCES public.company (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION,
    CONSTRAINT fund_entries_ern_dt_id_fkey11 FOREIGN KEY (ern_dt_id)
        REFERENCES public.ern_dt (id) MATCH SIMPLE
        ON UPDATE NO ACTION
        ON DELETE NO ACTION
)

В настоящее время я рассматриваю возможность использования операторов WITHдля выбора и доступа к fund_entries_id из запросов WITH.Не уверен, что это самый чистый способ сделать это.

Или, может быть, что-то вроде этого: Одна ВСТАВКА с несколькими SELECT

Хотя не уверен, как это реализовать.

Спасибо!

1 Ответ

0 голосов
/ 11 мая 2018

Вы можете подготовить данные для вставки в CTE, например ::

with rows_to_insert(fund_val, bbg_pulls_id, company_id, fiscal_prd_end_date) as (
values
    (  1, 20, 399, '2016-09-30'::date),
    (567, 20,   5, '2016-09-28')
)

insert into fund_data (fund_entries_id, fund_val, bbg_pulls_id)
select fe.id, ri.fund_val, ri.bbg_pulls_id
from fund_entries fe
join rows_to_insert ri using (company_id, fiscal_prd_end_date)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...