2015-04-10 2 views
0

Вот моя вставка запроса:Как я могу вставить данные, объявив все поля (не *)?

INSERT INTO listing_replica_child (
    (
     SELECT rtz_comma_list(column_name) 
     FROM information_schema.columns 
     WHERE table_name = 'listing' 
    ) 
    ) 
VALUES (
    (
     SELECT (
       (
       SELECT rtz_comma_list(column_name) 
       FROM information_schema.columns 
       WHERE table_name = 'listing' 
       ) 
       FROM listing 
       WHERE listing_id = 9656 
       ) 
     ) 
    ); 

Я использую Postgres.

+0

Зачем вам нужно что-то подобное? Единственный способ сделать это - использовать динамический SQL внутри функции PL/pgSQL. –

ответ

0
do $$ 
DECLARE rec TEXT; 
BEGIN 
    SELECT 'insert into listing_replica_child (' || t.col || ') select * from listing WHERE listing_id = 9656 ' 
    INTO rec 
    FROM (
     SELECT string_agg(column_name, ',') col 
     FROM information_schema.columns 
     WHERE table_name = 'listing' 
     ) t; 

    EXECUTE rec; 
END;$$; 

Вы можете обернуть эту динамический запрос в функцию как этот

CREATE OR replace FUNCTION insert_listing_replica_child (_listing_id INT) 
RETURNS void AS $$ 
DECLARE rec TEXT; 
BEGIN 
    SELECT 'insert into listing_replica_child (' || t.col || ') select * from listing WHERE listing_id = ' || _listing_id || ' ' 
    INTO rec 
    FROM (
     SELECT string_agg(column_name, ',') col 
     FROM information_schema.columns 
     WHERE table_name = 'listing' 
     ) t; 

    EXECUTE rec; 
END $$ 
LANGUAGE plpgsql 

Так что, если хотите, чтобы вставить значения из listing таблицы с lissting_id=9656 в таблице listing_replica_child

просто вызов

select insert_listing_replica_child (9656) 
+0

listing_replica_child имеет все столбцы листинга плюс еще 3 столбца, поэтому мне нужно объявить все столбцы листинга. – Clem

+0

@Clem просто обновите свой вопрос с дополнительной информацией и предоставите DDL для обеих таблиц –

+0

@Clem Еще одно уточнение, какие значения будут иметь значения для '3 других столбца', обновляется ли оно как null, когда вы вставляете значения из таблицы' listing'? –

0

Способ указать все поля назначения - полностью исключить список столбцов.

Ваша попытка становится:

INSERT INTO listing_replica_child 
SELECT * FROM listing 
WHERE listing_id = 9656 

без потери намерения: Если количество и тип полей таблиц отличается вашей попыткой, выполнение взорвется (как это будет запрос).

Даже если вы просили, чтобы * не использовался, это самый простой и лучший способ выполнить задачу.

+0

Моим первым ответом было это, постепенно я отредактировал его в соответствии с комментарием OP –

+1

просто см. [это] (http://stackoverflow.com/posts/29553902/revisions) –

+0

Я вижу. Если ответ вернется к этому запросу, дайте мне знать, и я удалю этот – Bohemian

Смежные вопросы