Я использую Postgres 12.2.
Я пытаюсь заполнить своего рода таблицу событий, в которой у меня есть один столбец, в котором нужно получить идентификатор чего-то.
В примере Я создал, события хранятся в таблице purchases
, а id должен быть идентификатором компании, взятым из таблицы companies
. Поскольку фиксированного набора компаний не существует, таблица компаний должна увеличиваться «по мере роста I go»;).
Итак, настройка следующая:
CREATE TABLE
companies
(
company_id SERIAL NOT NULL,
NAME CHARACTER VARYING(256) NOT NULL,
PRIMARY KEY (company_id),
CONSTRAINT companies_unique_name UNIQUE (NAME)
)
;
CREATE TABLE
purchases
(
purchase_id SERIAL NOT NULL,
purchase_date DATE DEFAULT CURRENT_DATE NOT NULL,
amount INTEGER NOT NULL,
company_id INTEGER NOT NULL,
PRIMARY KEY (purchase_id)
)
;
Итак, когда я хочу чтобы вставить событие «Купил 5 товаров у 'company1'», мне нужно получить идентификатор «company1», либо посмотрев его в таблице companies
, либо создав новую запись для «company1» в companies
.
Я могу сделать это так:
WITH EXISTING_COMPANY AS (
SELECT company_id FROM companies WHERE name = 'company1'
)
, NEW_COMPANY AS (
INSERT INTO companies (name) VALUES ('company1')
ON CONFLICT(name) DO NOTHING
RETURNING company_id
)
, GET_COMPANY_ID AS (
SELECT COALESCE(
(SELECT company_id FROM EXISTING_COMPANY),
(SELECT company_id FROM NEW_COMPANY)
) AS company_id
)
INSERT INTO purchases(amount, company_id)
VALUES (5, (select company_id from GET_COMPANY_ID))
;
CTE EXISTING_COMPANY
даст мне идентификатор существующей «компании1» или null
.
CTE NEW_COMPANY
даст мне идентификатор вновь созданной компании «company1» или null
CTE GET_COMPANY_ID
, наконец, с помощью coalesce
попытается получить существующий идентификатор и, если это не удается, новый идентификатор.
Хотя это работает, у него есть недостатки: мне нужно дважды указывать название компании и что мне нужны новые CTE для каждой компании, поскольку я не знаю, как передать название компании в мои CTE.
- Есть ли способ передать название компании моим CTE?
- Есть ли другие способы достижения моих цель?