Если я вставляю одну запись следующим образом:
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
Хотя не уверен, как это реализовать.
Спасибо!