PostgreSQL 9.5データベースでは、DAG内で相互に関連する異なるタイプのオブジェクト(それぞれ独自のテーブルに格納されています)があります。このDAGを表すために、私はnode
とedge
テーブルを設定しました。Postgres:WITHステートメントを持つSELECTクエリの結果を挿入します。
CREATE TABLE node (
id SERIAL PRIMARY KEY NOT NULL
);
はのは、私のオブジェクトの種類のいずれかが表library
であるとしましょう:node
表には、単にオブジェクトを格納するすべてのテーブルで共有されるグローバルに一意なIDが格納されます。他のフィールドを無視して、この表は単に:
CREATE TABLE library (
uuid INTEGER NOT NULL REFERENCES node(id),
id TEXT PRIMARY KEY NOT NULL
)
次のように私はlibrary
にID XXX
有する単一のエントリをロードすることができる:
WITH x AS (
INSERT INTO node (id) VALUES (DEFAULT) RETURNING id
)
INSERT INTO library (id, uuid) VALUES ('XXX', (SELECT id FROM x));
しかし、私は、外部リソースを参照するビューimport.library
を有します、そのビューからpublic.library
en masseをロードします。データ修正WITH
文は、トップレベルにあるため、可能ではない
INSERT INTO library (uuid, id)
WITH x AS (
INSERT INTO node (id) VALUES (DEFAULT) RETURNING id
)
SELECT (SELECT id FROM x), id FROM import.library;
:つまり、私はこのような何かをしたいです。
私はDO
文で匿名関数を使用して同じ結果を得ることができます:これは動作します
DO $$DECLARE l_id TEXT;
BEGIN
FOR x IN SELECT id FROM import.library
LOOP
WITH x AS (
INSERT INTO node (id) VALUES (DEFAULT) RETURNING id
)
INSERT INTO library (id, uuid) VALUES (l_id, (SELECT id FROM x));
END LOOP;
END$$;
が、私はまだそれがない単純なSQL文で同じことを行うことは可能ですかどうかを知りたいのですが無名の機能に頼っている。
@wjv:本当に外に考えている私の編集 –
を見ますボックス!うん、それはそのトリックをするようだから、私はそれを受け入れるつもりだ...ありがとう! – wjv