这是我的插入查询:
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 :(得分: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)
答案 1 :(得分:0)
指定所有目标字段的方法是完全省略列列表。
您的尝试将成为:
INSERT INTO listing_replica_child
SELECT * FROM listing
WHERE listing_id = 9656
不失意图:如果表的字段数量和类型与您的尝试不同,执行将会爆炸(此查询也是如此)。
即使你曾要求*
不被使用,这也是实现任务的最简单,最好的方法。