1. ホーム
  2. sql

[解決済み] ポストグレスク に挿入... (SELECT * ...)

2022-03-07 08:57:31

質問

標準的なSQLかどうかわからないのですが。

 INSERT INTO tblA 
 (SELECT id, time 
    FROM tblB 
   WHERE time > 1000)  

私が求めているのは tblA と tblB が異なる DB サーバーにある場合はどうなりますか? .

PostgreSql は、以下のようなユーティリティや機能を提供しますか? INSERT query with PGresult struct

つまり SELECT id, time FROM tblB ... が返されます。 PGresult* を使用すると PQexec . この構造体を別の PQexec を実行して、INSERTコマンドを実行します。

EDITです。
もし不可能なら、PQresult*から値を抽出して、次のような複数のINSERT文の構文を作成することになるでしょう。

INSERT INTO films (code, title, did, date_prod, kind) VALUES
    ('B6717', 'Tampopo', 110, '1985-02-10', 'Comedy'),
    ('HG120', 'The Dinner Game', 140, DEFAULT, 'Comedy'); 

これでプリペアドステートメントを作ることは可能なのでしょうか! :(

どのように解決するのですか?

Henrikが書いているように、dblinkを使ってリモートデータベースに接続し、結果を取得することができます。例えば

psql dbtest
CREATE TABLE tblB (id serial, time integer);
INSERT INTO tblB (time) VALUES (5000), (2000);

psql postgres
CREATE TABLE tblA (id serial, time integer);

INSERT INTO tblA
    SELECT id, time 
    FROM dblink('dbname=dbtest', 'SELECT id, time FROM tblB')
    AS t(id integer, time integer)
    WHERE time > 1000;

TABLE tblA;
 id | time 
----+------
  1 | 5000
  2 | 2000
(2 rows)

PostgreSQLは 記録 擬似型(関数の引数や結果の型のみ)で、別の(未知の)テーブルからデータを照会することができます。

編集する

必要ならprepared statementにすれば、同様に動作します。

PREPARE migrate_data (integer) 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;

EXECUTE migrate_data(1000);
-- DEALLOCATE migrate_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 time > 1000;'
);

ネストされたdblinkは好きではありませんが、AFAIKでは、tblBへの参照は dblink_exec の本体です。LIMITを使って上位20行を指定しますが、その前にORDER BY句でソートする必要があると思います。