2012-10-22 70 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

爲什麼其他人幾乎完全相同但不太完整,一分鐘後答案被投得更多並被接受? –