postgresql:INSERT INTO ...(SELECT * ...)
Postgresql Insert Into
解決:
Henrikが書いたように、dblinkを使用してリモートデータベースに接続し、結果をフェッチできます。例えば:
psql dbtest CREATE TABLE tblB(idシリアル、時間整数); INSERT INTO tblB(time)VALUES(5000)、(2000); psql postgres CREATE TABLE tblA(idシリアル、時間整数); INSERT INTO tblA SELECT id、time FROM dblink( 'dbname = dbtest'、 'SELECT id、time FROM tblB')AS t(id integer、time integer)WHERE time> 1000;表tblA; id |時間---- + ------ 1 | 5000 2 | 2000(2行)PostgreSQLにはレコード疑似型(関数の引数または結果型のみ)があり、別の(不明な)テーブルからデータをクエリできます。
編集:
必要に応じて、プリペアドステートメントとして作成できます。これも機能します。
PREPAREmigrate_data(整数)AS INSERT INTO tblA SELECT id、time FROM dblink( 'dbname = dbtest'、 'SELECT id、time FROM tblB')AS t(id integer、time integer)WHERE time> $ 1; EXECUTEmigrate_data(1000); --DEALLOCATEmigrate_data;編集(ええ、別の):
改訂された質問を見たところです(重複として閉じられているか、これと非常によく似ています)。
私の理解が正しければ(postgresにはtblaがあり、dbtestにはtblbがあり、 ローカル選択によるリモートインサート 、 いいえ ローカル挿入によるリモート選択 上記のように):
psql dbtest SELECT dblink_exec( 'dbname = postgres'、 'INSERT INTO tbla SELECT id、time FROM dblink(' 'dbname = dbtest' '、' 'SELECT id、time FROM tblb' ')AS t(id integer、time integer) WHERE時間> 1000; ');ネストされたdblinkは好きではありませんが、dblink_exec本体でtblBを参照することはできません。 LIMITを使用して上位20行を指定しますが、最初にORDERBY句を使用してそれらを並べ替える必要があると思います。
指定列に挿入する場合:
INSERT INTO table(time)(SELECT time FROM dblink( 'dbname = dbtest'、 'SELECT time FROM tblB')AS t(time integer)WHERE time> 1000);
dblinkを使用して、別のデータベースで解決されるビューを作成できます。このデータベースは別のサーバー上にある可能性があります。