はどのようにして、有効なPostgresのSQLクエリに次のように記述します:書き込み可能な共通テーブル式と複数の挿入ステートメント
with foo as (select * from ...)
insert into bar select * from foo
insert into baz select * from foo
はどのようにして、有効なPostgresのSQLクエリに次のように記述します:書き込み可能な共通テーブル式と複数の挿入ステートメント
with foo as (select * from ...)
insert into bar select * from foo
insert into baz select * from foo
あなたがすべて1つのステートメントでこれをしたい場合は、CTEを使用することができます。
with foo as (
select * from ...
),
b as (
insert into bar
select * from foo
returning *
)
insert into baz
select * from foo;
注:
insert
でカラムリストを含める必要があります。select *
には、列名を明示的にと指定する必要があります。 2つのテーブルで列が一致しない可能性があるため、これは重要です。returning
とupdate
/insert
/delete
をCTEで使用しています。これは通常の使用例です。たとえば、シリアルIDを挿入物から取得することができます。with
条項の範囲は1つだけのクエリです。私が考えることができる唯一の解決策は、ビューを作成し、挿入が完了したらそれをドロップすることです。これは、CTEのように完全に短命ではありませんが、ここではデータの重複ありません - ちょうど(比較的)安価なDDL操作は:
-- Create the view
CREATE VIEW foo AS SELECT * FROM ...;
-- Perform the inserts
INSERT INTO bar SELECT * FROM foo;
INSERT INTO baz SELECT * FROM foo;
-- Drop the view when you're done
DROP VIEW foo;
これは、(一時的な)ビューを必要とせず、単一のCTEで行うことができます。 –