2012-10-22 13 views
16

Ho una tabella chiamata map_tags:PostgreSQL: Sub-select inserto all'interno

map_id | map_license | map_desc 

e un altro tavolo (widgets) le cui scritture contiene un riferimento chiave esterna (1 a 1) a un record map_tags:

widget_id | map_id | widget_name 

Dato il vincolo che tutte le map_license s sono unici (tuttavia non sono impostati come tasti su map_tags), quindi se ho una map_license e widget_name, mi piacerebbe realizzare un inserto su widgets tutto all'interno della stessa istruzione 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' 
) 

Io credo Sono sulla strada giusta, ma so destra fuori del blocco che si tratta di SQL non corretta per Postgres. Qualcuno conosce il modo corretto per ottenere una singola query?

+1

avete mai fatto con PostgreSQL, ma non dovrebbe apparire come 'INSERT INTO widget SELEZIONA NULL, MAP_ID, 'Bupo' FROM WHERE map_tags map_license = '12345''? – raina77ow

+0

Grazie @ raina77ow (+1) - Non sono sicuro se è quello che dovrebbe essere. L'istruzione 'SELECT' al posto della sintassi' (...) VALUES (...) 'mi sta sicuramente buttando fuori. Ti dispiacerebbe spiegarmi come dovrebbe funzionare? Grazie ancora! –

+0

Beh, lo uso come [this] (http://dev.mysql.com/doc/refman/5.1/en/insert-select.html) in MySQL ... La ragione, suppongo, è che tu costruisci l'intero insieme di dati che verrebbero inseriti e VALORI ((SELECT smth), 'smth_else') semplicemente non lo fa.) – raina77ow

risposta

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

Questa è una sintassi super utile quando la tabella che si desidera inserire ha un SERIAL PK o simile – dougajmcdonald

26

Utilizzare la variante INSERT INTO SELECT, incluse le costanti corrette nell'istruzione SELECT.

Il PostgreSQL INSERT sintassi è:

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

Prendere nota del dell'opzione interrogazione alla fine della seconda linea di cui sopra.

Ecco un esempio per voi.

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

Perché l'altra risposta è quasi identica ma meno completa e un minuto dopo è stata più votata e accettata? –