나는 세 개의 테이블이 있습니다하나의 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 개 크기를 가지고
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');
복제 단일 쿼리의 모든 항목과 크기가 제안하는 방법이 있나요?
내가 CTE와 그것을 해결하려고 여기 내 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 결과, 내가 해결할 수없는 :
ERROR : 하나 이상의 표현식으로 사용 된 하위 쿼리에 의해 반환 된 행
귀하의 도움을 크게 받으실 수 있습니다.
P.S. 나는 PostgreSQL 9.5를 사용합니다.
감사합니다. 이는 단순히 놀랍고 필요한만큼 정확히 작동합니다. –
나는 여기에서 문제를 발견했다고 생각한다. 마지막 질의는 ** s.id에서 ** 항목을 선택하고 * items * 테이블에서 id를 선택합니다. –
@IM_AG : 당신 말이 맞습니다. 이전 항목 ID와 크기 테이블의 새 항목 ID 매핑이 생각보다 간단하지 않습니다. 내 새 버전이 그것을 처리해야합니다. –