1052: फील्ड सूची में कॉलम 'आईडी' अस्पष्ट है


94

मेरे पास 2 टेबल हैं। tbl_namesऔर उनमें tbl_sectionदोनों idक्षेत्र हैं। मैं idक्षेत्र का चयन कैसे करूं , क्योंकि मुझे हमेशा यह त्रुटि मिलती है:

1052: Column 'id' in field list is ambiguous

यहाँ मेरी क्वेरी है:

SELECT id, name, section
  FROM tbl_names, tbl_section 
 WHERE tbl_names.id = tbl_section.id

मैं बस सभी क्षेत्रों का चयन कर सकता हूं और त्रुटि से बच सकता हूं। लेकिन प्रदर्शन में यह बेकार होगा। मुझे क्या करना चाहिए?

जवाबों:


152

SQL पूर्ण तालिका नाम के साथ संदर्भ को उपसर्ग करके एक कॉलम को योग्य बनाने का समर्थन करता है:

SELECT tbl_names.id, tbl_section.id, name, section
  FROM tbl_names
  JOIN tbl_section ON tbl_section.id = tbl_names.id 

... या एक तालिका उपनाम:

SELECT n.id, s.id, n.name, s.section
  FROM tbl_names n
  JOIN tbl_section s ON s.id = n.id 

तालिका उपनाम अन्य अनुशंसित दृष्टिकोण है - आपके पास अधिक से अधिक प्रकार क्यों है?

ये प्रश्न अलग क्यों दिखते हैं?

दूसरे, मेरे जवाब में ANSI-92 JOIN सिंटैक्स (तुम्हारा ANSI-89 है) का उपयोग किया गया है। जब वे एक ही प्रदर्शन करते हैं, ANSI-89 सिंटैक्स OUTER जॉन्स (राइट, बाएँ, पूर्ण) का समर्थन नहीं करता है। ANSI-89 वाक्यविन्यास को पदावनत माना जाना चाहिए, SO पर कई ऐसे हैं जो ANSI-89 वाक्यविन्यास के लिए मतदान नहीं करेंगे ताकि इसे सुदृढ़ किया जा सके। के लिए अधिक जानकारी, इस सवाल को देखने


भ्रामक! क्योंकि वास्तव में SQL भाषा से कुछ भी हटाया नहीं गया है, SQL-89 SQL-92 का एक उचित उपसमूह है। ओपी का सिंटैक्स वैध एसक्यूएल -92 सिंटैक्स है (और जब तक मैं कुछ याद नहीं कर रहा हूं, आपका एसक्यूएल -89 सिंटैक्स वैध है)। INNER JOINजब से SQL-92 की शुरुआत हुई है, मैं 'मूल्यह्रास' मानता हूं NATURAL JOIN
onedaywhen

16

अपने SELECTबयान में आपको अपनी आईडी को उस तालिका के साथ प्रस्तुत करने की आवश्यकता है जिसे आप इसे चुनना चाहते हैं।

SELECT tbl_names.id, name, section 
FROM tbl_names
INNER JOIN tbl_section 
   ON tbl_names.id = tbl_section.id

या

SELECT tbl_section.id, name, section 
FROM tbl_names
INNER JOIN tbl_section 
   ON tbl_names.id = tbl_section.id

यह केवल idखेतों में से एक को लौटाता है ; ओपी कहता है "बस सभी क्षेत्रों का चयन करें और त्रुटि से बचें।" और, मैं ANSI-89 सिंटैक्स के लिए वोट नहीं करता हूं।
OMG पॉनीज़

सहमत थे लेकिन सवाल था कि आईडी फील्ड का चयन कैसे किया जाए।
टैरिन

6

आप ऐसा करेंगे कि पूरी तरह से योग्य नाम प्रदान करके, जैसे:

SELECT tbl_names.id as id, name, section FROM tbl_names, tbl_section WHERE tbl_names.id = tbl_section.id

जो आपको tbl_names की आईडी देगा


ब्लूफेट के उत्तर के लिए मेरी टिप्पणी देखें
OMG

यह एक 'पूरी तरह से योग्य नाम' नहीं है, यह एक रेंज वैरिएबल है। जब आप एक स्पष्ट श्रेणी चर को छोड़ते हैं, तो SQL एक उत्पन्न करता है जो तालिका नाम के समान है। यह देखने के लिए कि मेरा क्या मतलब है, अपने FROMखंड को बदलें ...FROM tbl_names tbl_names, tbl_section tbl_section WHERE...- यही वह है जो पार्सर रेंज वैरिएबल उत्पन्न करने के लिए कर रहा है।
onedaywhen

4

इसके USINGबजाय सबसे सरल समाधान एक जुड़ाव है ON। इस तरह, डेटाबेस "जानता है" कि दोनों idकॉलम वास्तव में समान हैं, और उस पर नाइटपिक नहीं करेंगे:

SELECT id, name, section
  FROM tbl_names
  JOIN tbl_section USING (id)

अगर idमें केवल आम स्तंभ नाम है tbl_namesऔर tbl_section, आप भी एक का उपयोग कर सकते NATURAL JOIN:

SELECT id, name, section
  FROM tbl_names
  NATURAL JOIN tbl_section

इसे भी देखें: https://dev.mysql.com/doc/refman/5.7/en/join.html


3

आप वास्तव में यहाँ क्या करना चाहते हैं, इस तरह से यूनियन ऑपरेटर का उपयोग करें:

(select ID from Logo where AccountID = 1 and Rendered = 'True')
  union
  (select ID from Design where AccountID = 1 and Rendered = 'True')
  order by ID limit 0, 51

यहाँ इसके लिए डॉक्स हैं https://dev.mysql.com/doc/refman/5.0/en/union.html


3

पहले से ही आपके प्रश्न के बहुत सारे उत्तर हैं, आप इसे इस तरह भी कर सकते हैं। आप अपनी तालिका को एक उपनाम नाम दे सकते हैं और इसका उपयोग इस तरह से चयन क्वेरी में कर सकते हैं:

SELECT a.id, b.id, name, section
FROM tbl_names as a 
LEFT JOIN tbl_section as b ON a.id = b.id;

0

यदि दो तालिका में आईडी का प्रारूप भिन्न होता है, तो आप उनसे जुड़ना चाहते हैं, जैसे कि आप एक-मुख्य तालिका से एक आईडी का उपयोग करना चुन सकते हैं, यदि आपके पास है table_customesऔर table_ordersआदेशों के लिए था आईडी " 101 " जैसा है , " 102 " ... " 110 ", बस ग्राहकों के लिए एक का उपयोग करें

select customers.id, name, amount, date from customers.orders;

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.