2012-10-22 11 views
16

मैं हैPostgreSQL: एक मेज <code>map_tags</code> बुलाया उप-चयन के अंदर डालने

map_id | map_license | map_desc 

और एक और तालिका (widgets) जिसका रिकॉर्ड एक map_tags रिकॉर्ड करने के लिए एक विदेशी कुंजी संदर्भ (1 1 के लिए) शामिल हैं:

widget_id | map_id | widget_name 

बाधा है कि सभी map_license अद्वितीय हैं (हालांकि map_tags पर कुंजी के रूप में स्थापित नहीं कर रहे हैं) को देखते हुए, तो अगर मैं एक map_license और एक widget_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 के लिए गलत एसक्यूएल है बंद जानते मानना ​​है । क्या कोई ऐसी क्वेरी को प्राप्त करने का उचित तरीका जानता है?

+1

यह PostgreSQL के साथ कभी नहीं किया है, लेकिन ऐसा लगता है 'INSERT INTO विजेट से map_tags कहां map_license = ', शून्य का चयन करें map_id,' Bupo '12345'' नहीं देखना चाहिए? – raina77ow

+0

धन्यवाद @ raina77ow (+1) - मुझे यकीन नहीं है कि यह क्या होना चाहिए। '(...) मूल्यों (...) के सिलेक्स में 'चयन' कथन निश्चित रूप से मुझे बंद कर रहा है। क्या आप मुझे समझाएंगे कि यह कैसे काम करना चाहिए? एक बार फिर धन्यवाद! –

+0

ठीक है, मैं बस इसे [this] (http://dev.mysql.com/doc/refman/5.1/en/insert-select.html) का उपयोग MySQL में करता हूं ... कारण, मुझे लगता है कि, आप डेटा के पूरे सेट को बनाना होगा जो डाला जाएगा - और 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

यह एक सुपर उपयोगी वाक्यविन्यास है जब आप जिस टेबल को सम्मिलित करना चाहते हैं उसके पास एक सीरियल पीके या समान है – 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

अन्य लगभग समान लेकिन कम पूर्ण क्यों है और एक मिनट बाद का उत्तर अधिक वोट दिया गया है और स्वीकार किया गया है? –

संबंधित मुद्दे