Sql

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を使用して、別のデータベースで解決されるビューを作成できます。このデータベースは別のサーバー上にある可能性があります。