MySQL में "हर व्युत्पन्न तालिका का अपना उपनाम होना चाहिए" क्या त्रुटि है?


386

मैं यह क्वेरी MySQL पर चला रहा हूं

SELECT ID FROM (
    SELECT ID, msisdn
    FROM (
        SELECT * FROM TT2
    )
);

और यह त्रुटि दे रहा है:

हर व्युत्पन्न तालिका का अपना अलग नाम होना चाहिए।

इस त्रुटि के कारण क्या है?


14
क्या आप इसे "TT2 से चयनित आईडी" के रूप में सरल नहीं कर सकते?
DMKing

5
मुझे यह त्रुटि हाल ही में मिली क्योंकि मेरे पास )क्वेरी में एक बहुत कुछ था UNION ALL
एमपीएन

10
यह देखते हुए कि यह # 1 Google खोज कैसे है ... स्वीकृत उत्तर वास्तव में त्रुटि का जवाब नहीं देता है 'प्रत्येक व्युत्पन्न तालिका का अपना उपनाम होना चाहिए'। अधिक जानकारी के लिए नीचे देखें।
डैनियल बी। चैपमैन

जवाबों:


542

प्रत्येक व्युत्पन्न तालिका (AKA उप-क्वेरी) में वास्तव में एक उपनाम होना चाहिए। यानी कोष्ठक में प्रत्येक क्वेरी को एक उपनाम ( AS whatever) दिया जाना चाहिए , जिसका उपयोग बाकी बाहरी क्वेरी में इसे संदर्भित करने के लिए किया जा सकता है।

SELECT ID FROM (
    SELECT ID, msisdn FROM (
        SELECT * FROM TT2
    ) AS T
) AS T

आपके मामले में, निश्चित रूप से, पूरी क्वेरी को इसके साथ बदला जा सकता है:

SELECT ID FROM TT2

21
दिखाए गए sampe कोड के लिए सही उत्तर है, लेकिन अधिकांश उपयोगकर्ताओं के लिए यह सवाल नहीं है।
टोबे

1
@ToBe मैं उत्सुक हूं कि आपका क्या मतलब है? यह उत्तर किसी भी प्रश्न में सही है, कि यदि आपके खंड में एक व्युत्पन्न तालिका है, तो आपको इसे एक उपनाम देने की आवश्यकता है।
एडमएमसी 331

2
क्षमा करें, मैंने नहीं देखा कि आपने मूल क्वेरी भी तय कर दी है और ASबयान जोड़ दिए हैं। मुझे लगा कि आपने केवल शॉर्टहैंड दिखाया है। मेरा पदच्युत हटा दिया।
टोबे

मैं @ToBe के साथ भी यही सोच रहा हूं। इसका उत्तर यह है: "यहां, व्युत्पन्न तालिका का अर्थ है 'FROM क्लॉज में प्रयुक्त उप-क्वेरी'। प्रश्नकर्ताओं के मामले में, वे कोष्ठक के अंदर उप-प्रश्न हैं। यदि आप कीवर्ड के रूप में 'का उपयोग करके उपनाम' का संकेत नहीं देते हैं। ' उन प्रश्नों के लिए, dbms क्वेरी इंजन यह निर्धारित नहीं कर सकता है कि उनके नाम (या उपनाम) के बिना कौन सी क्वेरी है, इसलिए, आपको dbms क्वेरी इंजन बनाने के लिए अपने सभी उप-प्रश्नों के लिए अद्वितीय नाम (उपनाम) देना होगा, यह ठीक से काम करता है। "
बहदिर तसदिमिर

1
यह स्पष्ट करने के लिए बेहतर होगा कि उप-वर्ग आवश्यक रूप से एक व्युत्पन्न तालिका नहीं है: इसे सीधे FROM खंड में होना चाहिए। जैसे कथन SELECT...FROM...WHERE x NOT IN (subquery) AS Tएक त्रुटि को ट्रिगर करेंगे
निकोलस

76

मुझे लगता है कि यह आपको ऐसा करने के लिए कह रहा है:

SELECT ID
FROM (SELECT ID,
             msisdn 
      FROM (SELECT * FROM TT2) as myalias
     ) as anotheralias;

लेकिन आप इस क्वेरी को पहले स्थान पर क्यों लिखेंगे?


16
वास्तविक क्वेरी बहुत लंबी है .. मैंने इसे इतना छोटा कर दिया है कि यहां के लोगों को इसे समझने में कम समय लगता है। छोटी और लंबी क्वेरी पर त्रुटि समान थी।
चांदीक्डी

मैं अब समझता हूँ। मैं यह भी सोच रहा था कि यह किसी कोड द्वारा उत्पन्न किया गया हो सकता है। यह अभी भी पॉल और DMKing सुझाव के रूप में सरल करना चाहिए।
गृहनगर

9
वाह, क्या यह वास्तव में अस्वीकार्य दूसरा उत्तर है? समस्या के साथ किसी के लिए भी यह जवाब है, MySQL आपको "उप क्वेरी" को लेबल करने की आवश्यकता है बजाय इसके कि इसे कई अन्य कार्यान्वयन की तरह छोड़ दें।
डैनियल बी। चैपमैन

17

यहाँ एक अलग उदाहरण है जिसे बिना उपनाम के नहीं लिखा जा सकता (नहीं GROUP BY DISTINCT)।

एक मेज कहा जाता है की कल्पना purchasesरिकॉर्ड द्वारा की गई खरीद कि customersपर stores, यानी यह कई टेबल और सॉफ्टवेयर की जरूरत है पता करने के लिए जो ग्राहकों से अधिक की दुकान पर खरीद बना दिया है करने के लिए एक बहुत है:

SELECT DISTINCT customer_id, SUM(1)
  FROM ( SELECT DISTINCT customer_id, store_id FROM purchases)
  GROUP BY customer_id HAVING 1 < SUM(1);

.. त्रुटि के साथ तोड़ना Every derived table must have its own alias। तै होना:

SELECT DISTINCT customer_id, SUM(1)
  FROM ( SELECT DISTINCT customer_id, store_id FROM purchases) AS custom
  GROUP BY customer_id HAVING 1 < SUM(1);

( AS customउर्फ नोट करें )।


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