2015-10-18 42 views
1

如PostgreSQL的manual描述一个可以在一个INSERT语句添加多行:INSERT从选择多行PostgreSQL中

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

还嵌套SELECT这样的查询工作:

INSERT INTO films (code, title, did, date_prod, kind) 
    SELECT table.code, 'Tampopo', 110, '1985-02-10', 'Comedy' 
    FROM other_table AS table2; 

然而,我似乎无法想出一个办法,在同一时间做两个:

INSERT INTO films (code, title, did, date_prod, kind) 
SELECT 
    (table.code + 100, 'abc', NULL, t2.date_prod, t2.kind), 
    (table.code + 200, 'xyz', NULL, t2.date_prod, t2.kind) 
FROM other_table AS t2; 

如果other_table只包含(61717 | 'Tampopo' | NULL | '1985-02-10' | 'Comedy'),结果表是这样的:

code | title |  did |  date_prod  |  kind 
-------------------------------------------------- 
61817 | 'abc' | NULL | '1985-02-10' | 'Comedy' 
61917 | 'xyz' | NULL | '1985-02-10' | 'Comedy' 

This fiddle应进一步解释......

可否请你指出我的地方,我错了。如果可能,我想避免在other_table AS t2中进行多次查找,因为它是VIEW,并且需要花费相当多的时间来构建。

+0

'table.code + 100'也不起作用。 'code'似乎是一个字符列,你不能在字符串中使用'+'。 Plus:“HG120”+ 100“的预期结果是什么 - 这没有意义。 –

+0

@a_horse_with_no_name Uff。抱歉。试图让事情变得更清楚......应该是一个'INT'。 – n1000

回答

2

您可以使用INSERT INTO ... UNION ALL

INSERT INTO films (code, title, did, date_prod, kind) 
SELECT t2.code + 100, t2.title, t2.did, t2.date_prod, t2.kind 
FROM other_table AS t2 
UNION ALL 
SELECT t2.code + 200, t2.title, t2.did, t2.date_prod, t2.kind 
FROM other_table AS t2; 
+0

@ n1000更新,无论如何,联盟所有将做的工作 – lad2025

+0

这将导致VIEW other_table被构造两次? – n1000

+0

可能不是,但要确保检查执行计划 – lad2025

2

一般来说,你可以使用selectunion

insert into films (code, title, did, date_prod, kind) 
    select t2.code + 100, t2.title, NULL::float, t2.date_prod, t2.kind 
    from other_table AS t2 
union 
    select t2.code + 200, t2.title, NULL::float, t2.date_prod, t2.kind 
    from other_table AS t2; 

在您所描述的特定情况下,你可以使用unnest (array [])

insert into films (code, title, did, date_prod, kind) 
    select 
     unnest(array[t2.code + 100, t2.code + 200]), 
     t2.title, NULL::float, t2.date_prod, t2.kind 
    from other_table AS t2 
+0

同样的问题适用于你的解决方案:(尝试取消注释:http:/ /sqlfiddle.com/#!15/4884e/3/0 – n1000

+1

简单的转换,请参阅编辑的答案(你应该在问题的前面给出表格定义) – klin

+0

好的,上次我打扰了 - 答应了:)你的第二个解决方案是有趣的是因为'UNION'看起来'other_table' VIEW构造了两次,这对我来说是相当昂贵的。数组可以扩展到其他值还是整行? – n1000