У меня есть три таблицы:Как сделать глубокую копию с помощью одного запроса PostgreSQL?
CREATE TABLE offers
(
id serial NOT NULL PRIMARY KEY,
title character varying(1000) NOT NULL DEFAULT ''::character varying
);
CREATE TABLE items
(
id serial NOT NULL PRIMARY KEY,
offer_id integer NOT NULL,
title character varying(1000) NOT NULL DEFAULT ''::character varying,
CONSTRAINT items_offer_id_fkey FOREIGN KEY (offer_id)
REFERENCES offers (id)
);
CREATE TABLE sizes
(
id serial NOT NULL PRIMARY KEY,
item_id integer NOT NULL,
title character varying(1000) NOT NULL DEFAULT ''::character varying,
CONSTRAINT sizes_item_id_fkey FOREIGN KEY (item_id)
REFERENCES items (id)
);
У меня есть 1 предложение, которое имеет 2 пунктов. Каждый элемент имеет 2 размера:
INSERT INTO offers (title) VALUES ('My Offer');
INSERT INTO items (offer_id, title) VALUES (1, 'First Item');
INSERT INTO items (offer_id, title) VALUES (1, 'Second Item');
INSERT INTO sizes (item_id, title) VALUES (1, 'First Size of Item #1');
INSERT INTO sizes (item_id, title) VALUES (1, 'Second Size of Item #1');
INSERT INTO sizes (item_id, title) VALUES (2, 'First Size of Item #2');
INSERT INTO sizes (item_id, title) VALUES (2, 'Second Size of Item #2');
Есть ли способ клона свое предложение со всеми деталями и размерами с помощью одного запроса?
Я попытался решить эту проблему с КТР, вот мой SQL:
WITH tmp_offers AS (
INSERT INTO offers (title)
SELECT title FROM offers WHERE id = 1
RETURNING id
), tmp_items AS (
INSERT INTO items (offer_id, title)
(SELECT (SELECT id FROM tmp_offers), title FROM items WHERE offer_id = 1)
RETURNING id
)
INSERT INTO sizes (item_id, title)
(SELECT (SELECT id FROM tmp_items), title FROM sizes WHERE id IN (
SELECT sizes.id FROM sizes
JOIN items ON items.id = sizes.item_id
WHERE items.offer_id = 1
));
Но это SQL приводит к ошибке, что я не могу решить:
ОШИБКА: более чем один строка, возвращаемая подзапросом, используемым в качестве выражения
Ваша помощь очень признательна.
P.S. Я использую PostgreSQL 9.5
Спасибо, сэр. Это просто потрясающе и работает точно так, как требуется. –
Думаю, я нашел здесь проблему. Последний запрос выполняет **, где s.id в ** и выбирает идентификатор из таблицы * items *. –
@IM_AG: вы правы. Оказывается, сопоставление старых идентификаторов элементов с идентификаторами новых элементов в таблице размеров не так просто, как я думал. Моя новая версия должна позаботиться об этом. –