SORU
21 Mayıs 2011, CUMARTESİ


postgresql: INSERT INTO ... (*SEÇ ...)

Eğer standart SQL emin değilim:

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

Ne arıyorum:eğer tblA ve tblB farklı DB Sunucuları vardır.

PostgreSql herhangi bir programı veya herhangi bir INSERT query with PGresult struct kullanmak için yardımcı olacak işlevleri sağlar

SELECT id, time FROM tblB ... PQexec PGresult* bir dönüş olacak. PQexec bu yapı bir EKLEME komutu uygulamak için kullanmak mümkün.

DÜZENLEME:
Eğer bu mümkün değilse o zaman PQresult* değerleri ayıklamak ve birden fazla INSERT deyimi gibi sözdizimi oluşturmak için giderdim:

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

Bunun dışında hazırlanmış bir açıklama yapmak mümkün mü!! :(

CEVAP
21 Mayıs 2011, CUMARTESİ


Henrik olarak dblink uzak veritabanına bağlanmak ve sonuç almak için kullanabilirsiniz yazdı. Örneğin:

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 record (bilinmeyen) başka bir tablodan veri sorgulamak sağlayan sözde türü (yalnızca işlevin bağımsız değişken veya sonuç türü için).

Düzenleme:

Eğer isterseniz olarak hazırlanan rapor hazırlayın ve iyi çalışır:

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;

Edit (evet, bir):

Ben sadece revised question (yinelenen, ya da sadece bu çok benzer olarak kapalı) gördüm.

Eğer benim anlayış (isim tbla ve dbtest tblb ve seni istiyorum . doğruysa ^strong>yerel ile uzak Ekle seçindeğiluzaktan yerel Ekle ile seçinyukarıdaki gibi):

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;'
);

İç içe geçmiş dblink sevmem, ama AFAIK dblink_exec vücutta tblB için referans veremem. Üst SINIRI 20 satır belirtmek için kullanın, ama onları ilk tümcesi ORDER BY kullanarak sıralama bence.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • ipsy

    ipsy

    1 EKİM 2012
  • Joseph Hayhoe

    Joseph Hayho

    20 Mayıs 2010
  • Top Gear

    Top Gear

    27 Mart 2006