복붙노트

[SQL] PostgreSQL의 : INSERT INTO ... (SELECT * ...)

SQL

PostgreSQL의 : INSERT INTO ... (SELECT * ...)

나는 그것의 표준 SQL의 경우 확실하지 않다 :

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

내가 찾고 있습니다 : TBLA 및 tblB 다른 DB 서버에 무엇합니다.

합니까 PostgreSQL은 어떤 유틸리티를 제공하거나있는 PGresult 구조체와 INSERT 쿼리를 사용하는 데 도움이 될 것입니다 어떤 기능이

내가 SELECT ID, tblB FROM 시간을 의미 ... PQexec의 사용에 대한있는 PGresult *를 반환합니다. 가능 삽입 명령을 실행하기 위해 다른 PQexec의이 구조체를 사용하는 것입니다.

편집하다: 나는 * 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'); 

그것은이 밖으로 준비된 문을 만들 수 있습니다! :(

해결법

  1. ==============================

    1.헨릭 쓴로서 당신은 원격 데이터베이스를 연결하고 결과를 가져 오기 위해 DBLINK 사용할 수 있습니다. 예를 들면 :

    헨릭 쓴로서 당신은 원격 데이터베이스를 연결하고 결과를 가져 오기 위해 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는 다른 (알 수없는) 테이블에서 당신에게 쿼리 데이터를 허용 (단 함수의 인수 나 결과 유형에 대한) 레코드 의사 유형이 있습니다.

    편집하다:

    당신이 원하는 그것뿐만 아니라 작동하는지 당신은 준비된 문으로 그것을 만들 수 있습니다 :

    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;
    

    편집 (예, 또 다른) :

    난 그냥 (중복 또는이 단지와 매우 유사으로 폐쇄) 수정 된 질문을 보았다.

    나의 이해가 맞으면 (포스트 그레스는 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 내가 dblink_exec 몸에 tblB에 참조 할 수 없습니다. 사용 LIMIT는 최고 20 행을 지정할 수 있습니다,하지만 난 당신이 그들을 먼저 ORDER BY 절을 사용하여 정렬 할 필요가 있다고 생각합니다.

  2. ==============================

    2.당신이에 삽입하려면 열을 지정 :

    당신이에 삽입하려면 열을 지정 :

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

    3.당신은 다른 데이터베이스에서 해결 된 뷰를 만들 DBLINK 사용할 수 있습니다. 이 데이터베이스는 다른 서버에있을 수 있습니다.

    당신은 다른 데이터베이스에서 해결 된 뷰를 만들 DBLINK 사용할 수 있습니다. 이 데이터베이스는 다른 서버에있을 수 있습니다.

  4. ==============================

    4.(여기 처음 본)이 표기법은 너무 유용 같습니다 :

    (여기 처음 본)이 표기법은 너무 유용 같습니다 :

    insert into postagem (
      resumopostagem,
      textopostagem,
      dtliberacaopostagem,
      idmediaimgpostagem,
      idcatolico,
      idminisermao,
      idtipopostagem
    ) select
      resumominisermao,
      textominisermao,
      diaminisermao,
      idmediaimgminisermao,
      idcatolico ,
      idminisermao,
      1
    from
      minisermao    
    
  5. ==============================

    5.다음은 DBLINK를 사용하지 않고 대체 솔루션입니다.

    다음은 DBLINK를 사용하지 않고 대체 솔루션입니다.

    가정하자 B는 소스 데이터베이스를 나타내며, A는 대상 데이터베이스를 나타냅니다 : 그때,

  6. ==============================

    6.

    insert into TABLENAMEA (A,B,C,D) 
    select A::integer,B,C,D from TABLENAMEB
    
  7. from https://stackoverflow.com/questions/6083132/postgresql-insert-into-select by cc-by-sa and MIT license