2012-10-22 35 views
16

我有一个表叫map_tagsPostgreSQL的:子选择内插

map_id | map_license | map_desc 

而另一个表(widgets),其记录包含外键引用(1:1)到map_tags记录:

widget_id | map_id | widget_name 

鉴于约束所有map_license s为唯一的(但不设置为上map_tags键),然后如果我有一个map_licensewidget_name,我想执行插入在widgets里面的所有相同的SQL语句:

INSERT INTO 
    widgets w 
(
    map_id, 
    widget_name 
) 
VALUES (
    (
     SELECT 
      mt.map_id 
     FROM 
      map_tags mt 
     WHERE 
      // This should work and return a single record because map_license is unique 
      mt.map_license = '12345' 
    ), 
    'Bupo' 
) 

相信我是在正确的轨道上,但知道了蝙蝠的权利,这是不正确的Postgres SQL。有没有人知道实现这种单一查询的正确方法?

+1

从来没有与PostgreSQL的完成它,但它不应该像'INSERT INTO部件选择NULL,MAP_ID, 'Bupo' FROM map_tags WHERE map_license =“12345''? – raina77ow

+0

Thanks @ raina77ow(+1) - 我不确定是否应该如此。代替'(...)VALUES(...)'语法的SELECT语句肯定会让我失望。你介意给我解释一下应该如何工作?再次感谢! –

+0

嗯,我只是在MySQL中使用它[this](http://dev.mysql.com/doc/refman/5.1/en/insert-select.html)...我想,原因是你必须构建将要插入的整个数据集 - 而VALUES((SELECT smth),'smth_else')就不会这样做。 ) – raina77ow

回答

18
INSERT INTO widgets 
(
    map_id, 
    widget_name 
) 
SELECT 
    mt.map_id, 'Bupo' 
FROM 
    map_tags mt 
WHERE 
    mt.map_license = '12345' 
+0

这是一个非常有用的语法,当你要插入的表有SERIAL PK或类似的 – dougajmcdonald

26

使用INSERT INTO SELECT变体,包括任何常量直接进入SELECT语句。

PostgreSQL的INSERT语法是:

INSERT INTO table [ (column [, ...]) ] 
{ DEFAULT VALUES | VALUES ({ expression | DEFAULT } [, ...]) [, ...] | query } 
[ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] 

。注意到在上述第二行的端部的查询选项。

下面是一个例子给你。

INSERT INTO 
    widgets 
    (
     map_id, 
     widget_name 
    ) 
SELECT 
    mt.map_id, 
    'Bupo' 
FROM 
    map_tags mt 
WHERE 
    mt.map_license = '12345' 
+1

为什么其他人几乎完全相同但不太完整,一分钟后答案被投得更多并被接受? –