2011-05-15 18 views
6

मेरे पास एक तालिका "queued_items" है। वर्तमान "user_id" और "item_id" गलत हैं, लेकिन अन्य तालिकाओं में संग्रहीत हैं: users.imported_id और items.imported_idत्रुटि: त्रुटि: तालिका का नाम एक से अधिक बार

अन्य टेबल और आयात से imported_id को पकड़ने का प्रयास कर रहे हैं।

Error : ERROR: table name "queued_items" specified more than once 

की कोशिश की लाइन से हटाने, यह त्रुटि आई:

Error : ERROR: syntax error at or near "INNER" 
LINE 4: INNER JOIN users ON queued_items.user_id = users.imported_id 
     ^

मैं भी से करने के लिए एक अन्य नाम जोड़ने और शामिल हों कोशिश की यहाँ मैं क्या करने की कोशिश की

UPDATE queued_items 
SET queued_items.user_id = users.id, 
    queued_items.item_id = items.id 
FROM queued_items 
INNER JOIN users ON queued_items.user_id = users.imported_id 
INNER JOIN items ON queued_items.item_id = items.imported_id 

इस त्रुटि हो रही है परिस्थितियों

UPDATE queued_items 
SET queued_items.user_id = users.id, 
    queued_items.item_id = items.id 
FROM queued_items as qi 
INNER JOIN users ON qi.user_id = users.imported_id 
INNER JOIN items ON qi.item_id = items.imported_id 

को यह त्रुटि मिली:

Error : ERROR: column "queued_items" of relation "queued_items" does not exist 
LINE 2: SET queued_items.user_id = users.id, 
      ^

कोई विचार? (Postgres 9)

पुनश्च इस उप क्वेरी से बचने की कोशिश:

UPDATE queued_items 
SET user_id = (SELECT id FROM users WHERE queued_items.user_id = users.imported_id), 
    item_id = (SELECT id FROM items WHERE queued_items.item_id = items.imported_id) 

... क्योंकि यह पागल धीमी

+0

क्या आपने 'FROM' खंड और जुड़ने की स्थितियों में' queued_items' के लिए उपनाम का उपयोग करने का प्रयास किया है? –

+0

बस कोशिश की। मैं परिणामों के साथ अपनी पोस्ट अपडेट कर दूंगा। – jmccartie

+1

'SET' खंड के दोनों हिस्सों से 'queued_items.' निकालें, यह उम्मीद है कि बाएं किनारे हमेशा आपके द्वारा अपडेट की जा रही तालिका से कॉलम के लिए संदर्भित हों। –

उत्तर

6

इस प्रयास करें:

UPDATE queued_items 
SET user_id = users.id, 
    item_id = items.id 
FROM users, items 
WHERE queued_items.user_id = users.imported_id 
    AND queued_items.item_id = items.imported_id 

हाँ, पुराने स्कूल की स्थिति में शामिल हो।

+0

त्रुटि: त्रुटि: "queued_items" संबंध का "queued_items" मौजूद नहीं है – jmccartie

+0

@jmccartie: मुझे लगता है कि मैंने एसक्यूएल तय किया है। कृपया मेरे अद्यतन संस्करण का प्रयास करें। –

-3

है आप FROM खंड जरूरत नहीं है। "Queued_items से" निकालें और आप कर चुके हैं।

+1

लाइन से हटाया गया -> त्रुटि: त्रुटि: "INNER" पर या उसके पास वाक्यविन्यास त्रुटि लाइन 4: INNER उपयोगकर्ताओं को queued_items.user_id = users.imported_id पर क्लिक करें (मैं उस त्रुटि के साथ पोस्ट अपडेट करूंगा) ^ – jmccartie

-1

आपको उपनाम में UPDATE के बाद नाम बदलने में सक्षम होना चाहिए। इसके अलावा आप सेट क्लॉज में उपनाम नामों का उपयोग कर सकते हैं। इसका मतलब है कि आप उन्हें अपने JOIN खंडों में भी सेट कर सकते हैं।

UPDATE qi 
SET qi.user_id = us.id, 
    qi.item_id = itms.id 
FROM queued_items qi 
INNER JOIN users us ON qi.user_id = us.imported_id 
INNER JOIN items itms ON qi.item_id = itms.imported_id 
+1

त्रुटि : त्रुटि: संबंध "क्यूई" मौजूद नहीं है – jmccartie

5

From postgres site

UPDATE [ ONLY ] table [ [ AS ] alias ] 
    SET { column = { expression | DEFAULT } | 
      (column [, ...]) = ({ expression | DEFAULT } [, ...]) } [, ...] 
    [ FROM from_list ] 
    [ WHERE condition | WHERE CURRENT OF cursor_name ] 
    [ RETURNING * | output_expression [ [ AS ] output_name ] [, ...] ] 

* from_list *

A list of table expressions, allowing columns from other tables to appear in the WHERE condition and the update expressions. This is similar to the list of tables that can be specified in the FROM Clause of a SELECT statement. Note that the target table must not appear in the from_list, unless you intend a self-join (in which case it must appear with an alias in the from_list).

+0

एक आत्म-शामिल होने का एक उदाहरण? – fatuhoku

1

उपयोग उप क्वेरी बयान और उन स्तंभों को अनुक्रमित जोड़ें।

2
UPDATE queued_items 
SET user_id = users.id, 
    item_id = items.id 
FROM queued_items as QI 
INNER JOIN users ON QI.user_id = users.imported_id 
INNER JOIN items ON QI.item_id = items.imported_id 
+0

कुछ संदेश लिखें, न केवल कोड, कृपया बताएं –

+0

जिस तरह से मैं इस पर प्रलेखन की व्याख्या करता हूं: अद्यतन के तुरंत बाद 'queued_items' वास्तव में उपनाम के रूप में माना जाता है जब खंड से भी होता है। तकनीकी रूप से इस क्वेरी को अद्यतन QI के रूप में काम करना चाहिए ... queued_items से QI के रूप में ... तो त्रुटि कहती है, "अरे, वह उपनाम पहले से ही पूरी तरह से लिया गया है"। असल में यदि हमारे पास केवल एक क्लॉज है, तो मुझे टेबल के साथ फ़ील्ड संदर्भों को पूरी तरह से अर्हता प्राप्त करने की आवश्यकता नहीं है, लेकिन जैसे ही मैं एक क्लॉज क्लॉज पेश करता हूं, हमें टेबल के लिए उपनाम पेश करने की आवश्यकता होती है ताकि संकलक हो भ्रमित नहीं हो। –

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