Postgres 9.5を使用する。挿入に含まれていないフィールドを挿入選択から戻すことはできますか?
私はいくつかのレコードを持つテーブルbase
を持っている:
CREATE TABLE base
(
id serial NOT NULL
, thing varchar
, copy varchar
);
私はテーブルnew
にそれらのレコードのサブセットを挿入する:
CREATE TABLE new
(
id serial NOT NULL
, new_thing varchar
, new_copy varchar
);
new
は、格納するための列を持っていませんbase.id
。しかし、私はnew
行がから作成されたことnew.id
からbase
行にマップできるようにしたいと思います:
CREATE TABLE base_to_new
(
base_id int NOT NULL
, new_id int NOT NULL
);
これは私が何をしたいの要旨であるが、それは動作しません:
WITH new_rows AS
(
INSERT INTO new
(
, new_thing
, new_copy
)
SELECT
thing
, copy
FROM base
WHERE copy = 'yes'
RETURNING
(
base.id AS base_id
, new.id AS new_id
)
)
INSERT INTO base_to_new
SELECT
new_rows.base_id
, new_rows.new_id
FROM new_rows
;
base
とnew
のスキーマは変更できません。
私はまた、実際には のフィールドがテーブルの例よりも多いので、テーブルが非常に大きく、 となりました。ここで
INSERT INTO base_to_new
SELECT
base.id
, new.id
FROM base
LEFT JOIN new
ON thing = new_thing
AND item = new_item
AND stuff = new_stuff
AND last = new_last
;
は、スキーマといくつかのデータとSQLのフィドルです:
http://sqlfiddle.com/#!15/bbb9d
ありがとう!
ありがとうございますが、これで問題は解決しません。最後に私の注釈を見た場合、 'base'からの行が' new'に挿入された行と同じであることを保証するために必要なフィールド比較の数は大きすぎます。さらに、これらの条件に合致する 'new'の行が既にあります。挿入の' base.id'へのアクセスが必要です。 – Sibicle
あなたはより良いデザインでは決して起こらない問題を解決しようとしています。 – klin
私たちは常に理想的なデザインで作業する贅沢さを持っているわけではありません!時には数百の列と数百万行のテーブルを持つレガシーソフトウェアを使用している場合もあります。その解決策を見つけるだけです。とにかくありがとうございます! – Sibicle