2008-11-28 17 views
72

मैं MySQL का उपयोग करने के खंडMySQL खंड

WITH authorRating(aname, rating) AS 
    SELECT aname, AVG(quantity) 
    FROM book 
    GROUP BY aname 

"के साथ" के साथ एक दृश्य बनाने के लिए कोशिश कर रहा हूँ लेकिन यह MySQL की तरह प्रतीत नहीं होता है "के साथ" इस का समर्थन करता है।

मैंने सोचा कि यह बहुत मानक था और मुझे यकीन है कि ओरेकल इसका समर्थन करता है। क्या "इसके साथ" खंड का उपयोग करने के लिए MySQL को मजबूर करने के लिए वैसे भी है? मैंने इसे माईसाम और innoDB इंजन के साथ आजमाया है। ये दोनों काम नहीं करते हैं।

उत्तर

0

मूल्यों के रूप में उप-चयन आमतौर पर कोष्ठक में होना चाहिए।

अपडेट: सुनिश्चित नहीं है कि आप किस वाक्यविन्यास का उपयोग करने का प्रयास कर रहे हैं। क्या आप एक और पूर्ण बयान दिखा सकते हैं? दृश्य बनाएं एक चयन कथन लेता है जो, afaik, के साथ हो सकता है लेकिन केवल एक स्वतंत्र चयन में मान्य होगा।

अपडेट 2: गलती, मैं केस के बारे में सोच रहा था, न कि। गुगलिंग ओरेकल के लिए सिंटैक्स के साथ कोई विशेष विशेष प्रदर्शन नहीं दिखाती है, जिसमें जांच विकल्प को छोड़कर MySQL भी समर्थन करता है। कृपया वर्णन करके शुरू करें कि आप क्या हासिल करने की कोशिश कर रहे हैं?

अद्यतन 3: सिर्फ एक अनुमान पर, आप कुछ इस तरह का मतलब: authorRating जहां के रूप में (aname द्वारा पुस्तक समूह से रेटिंग के रूप में चयन aname औसत (मात्रा))

का चयन करें ... foo से, ...

+0

ओरैकल 9 और ऊपर – EvilTeach

5

ओरेकल समर्थन करता है।

यह ऐसा दिखाई देगा।

WITH emps as (SELECT * FROM Employees) 
SELECT * FROM emps WHERE ID < 20 
UNION ALL 
SELECT * FROM emps where Sex = 'F' 

@ysth के साथ Google को मुश्किल है क्योंकि यह आमतौर पर खोजों से बाहर एक आम शब्द है।

आप यह देखने के लिए SELECT docs पर देखना चाहते हैं कि सबक्वायरी फैक्टरिंग कैसे काम करती है।

मुझे पता है कि यह ओपी का जवाब नहीं देता है लेकिन मैं किसी भी भ्रम की सफाई कर रहा हूं या नहीं।

+0

के साथ समर्थन करता है वैसे भी मेरे भ्रम को दूर नहीं किया। क्या आप कह रहे हैं कि कोई खंड नहीं है लेकिन एक बयान है? – ysth

+0

आह, मैं देखता हूं। यह एक चयन का एक खंड है जो चयन से पहले है। क्या इसे व्यू व्यू में भी इस्तेमाल किया जा सकता है? उप-चयन में शामिल होने से यह अलग कैसे है? मुझे ऑनलाइन उदाहरण नहीं दिख रहे हैं जहां PAR के नाम के पैरामीटर हैं - वे कैसे काम करते हैं? – ysth

+0

यह बहुत अलग है। ध्यान दें कि उसी उपकुंजी को दो बार परिभाषित किए बिना दो बार उपयोग किया जाता है। निश्चित रूप से आप वहां वही क्वेरी कॉपी/पेस्ट कर सकते हैं लेकिन यह एक साधारण उदाहरण है। कल्पना करें कि अगर कोई पृष्ठ किसी पृष्ठ के लिए चला गया है और मुख्य क्वेरी में 4 बार उपयोग किया गया था। आप इसके बाद सराहना करेंगे। –

84

अद्यतन: MySQL 8.0 अंततः रिकर्सिव सीटीई समेत सामान्य तालिका अभिव्यक्तियों की सुविधा प्राप्त कर रहा है।

यहाँ एक ब्लॉग में यह घोषणा है: http://mysqlserverteam.com/mysql-8-0-labs-recursive-common-table-expressions-in-mysql-ctes/

नीचे मेरी पहले जवाब है, जो मैं मूल रूप से 2008 में लिखा है


MySQL WITH वाक्य रचना एसक्यूएल-99 में परिभाषित का उपयोग करके क्वेरी का समर्थन नहीं करता, सामान्य तालिका अभिव्यक्ति भी कहा जाता है।

यह जनवरी 2006 के बाद MySQL के लिए एक सुविधा का अनुरोध किया गया है: http://bugs.mysql.com/bug.php?id=16244

अन्य आरडीबीएमएस उत्पादों है कि आम तालिका अभिव्यक्ति का समर्थन:

अन्य डाटाबेस कि खंड के साथ लिए समर्थन की कमी (फरवरी 2014 को):

  • इन्फोर्मिक्स
    (इन्फोर्मिक्स CONNECT BY वाक्य रचना है कि एक बार ओरेकल द्वारा इस्तेमाल किया गया था का समर्थन करता है, हालांकि)

    WITH AuthorRating(AuthorName, AuthorRating) AS 
        SELECT aname   AS AuthorName, 
          AVG(quantity) AS AuthorRating 
        FROM Book 
        GROUP By Book.aname 
    

    हालांकि, के रूप में दूसरों का उल्लेख किया है, MySQL इस आदेश का समर्थन नहीं करता:http://pic.dhe.ibm.com/infocenter/idshelp/v115/index.jsp?topic=%2Fcom.ibm.sqls.doc%2Fids_sqs_2033.htm

+0

SQLite [संस्करण के साथ] [https://www.sqlite.org/lang_with.html) [संस्करण 3.8.3] (http://www.sqlite.org/changes.html#version_3_8_3) के रूप में जारी करता है 2014-02-03। – Martijn

+0

मैंने सूची में एच 2 और फायरबर्ड जोड़ा। –

+0

@a_horse_with_no_name, जोड़ों के लिए धन्यवाद। शायद हम इस पुराने फीचर अनुरोध के लिए प्राथमिकता बढ़ाने में MySQL को शर्मिंदा कर सकते हैं! –

11

आप वाक्य रचना सही मिल गया है। एसक्यूएल में जोड़ा गया था: 1 999; एसक्यूएल मानक का नवीनतम संस्करण एसक्यूएल: 2008 है। आप उन डेटाबेस के बारे में कुछ और जानकारी प्राप्त कर सकते हैं जो एसक्यूएल का समर्थन करते हैं: Wikipedia पर 1 999 की विभिन्न विशेषताएं।

MySQL पारंपरिक रूप से एसक्यूएल मानक के लिए समर्थन में थोड़ा सा है, जबकि ओरेकल, एसक्यूएल सर्वर (हाल ही में) जैसे वाणिज्यिक डेटाबेस, और डीबी 2 ने उन्हें थोड़ा और बारीकी से पालन किया है। PostgreSQL आमतौर पर सुंदर मानक अनुरूप भी है।

आप MySQL के रोडमैप को देखना चाह सकते हैं; मुझे पूरी तरह से यकीन नहीं है कि यह सुविधा समर्थित हो सकती है, लेकिन पठनीय रोल-अप क्वेरी बनाने के लिए यह बहुत अच्छा है।

10

आप इस तरह somethinkg में रुचि हो सकती:

select * from (
    select * from table 
) as Subquery 
+0

से लैगिंग कर रहा है, तो क्या आप सबक्वायरी को समझा सकते हैं? क्या मेरे पास हो सकता है * से ( (तालिका 1 से * चुनें) यूनियन सभी (तालिका 2 से * चुनें) ) कुछ समूह? –

+1

@ कैथी हाय, 'सबक्वायरी' वह नाम है जिसका उपयोग मैंने व्युत्पन्न तालिका के लिए किया था। जब आप 'से (...)' का उपयोग करते हैं तो आप एक अस्थायी तालिका (व्युत्पन्न तालिका) की तरह कुछ बनाते हैं और इसके लिए एक नाम की आवश्यकता होती है। यही कारण है कि मैंने 'सबक्वायरी 'के रूप में उपयोग किया। अपने प्रश्न का उत्तर देते हुए, हाँ, आप कर सकते हैं, लेकिन आपको बाहरी व्युत्पन्न तालिका में नाम देना होगा ('समूह द्वारा' से पहले)। उम्मीद है कि मदद की। –

+0

मेरे डीबी को लटकने का कारण बनता है ... –

1

क्या तुमने कभी अस्थायी तालिका की कोशिश की?हर इस सत्र में चयन में

create temporary table abc (
column1 varchar(255) 
column2 decimal 
); 
insert into abc 
select ... 
or otherwise 
insert into abc 
values ('text', 5.5), ('text2', 0815.8); 

तो फिर तुम इस तालिका का उपयोग कर सकते हैं:: यह मेरा convern हल

select * from abc inner join users on ...; 
+0

मेरे पास है ध्यान दें: http://stackoverflow.com/questions/343402/getting-around-mysql-cant-reopen-table-error आप तालिका को दो बार नहीं खोल सकते हैं :-( – Claus

+0

टेबल में छोटे डेटा सेट के लिए मेरा सॉल्शन: तालिका abc2 बनाएं एबीसी; एबीसी से abc2 चयन * में डालें; – Claus

1

बिल्डिंग @Mosty Mostacho से जवाब पर, यहाँ आप में कुछ बराबर कैसे कर सकता है MySQL, यह निर्धारित करने के एक विशिष्ट मामले के लिए कि तालिका में कौन सी प्रविष्टियां मौजूद नहीं हैं, और किसी अन्य डेटाबेस में नहीं हैं।

select col1 from (
    select 'value1' as col1 union 
    select 'value2' as col1 union 
    select 'value3' as col1 
) as subquery 
left join mytable as mytable.mycol = col1 
where mytable.mycol is null 
order by col1 

आप उद्धृत चयन संघ खंड में मूल्यों की सूची को परिवर्तित करने के लिए मैक्रो क्षमताओं के साथ एक टेक्स्ट एडिटर का उपयोग करना चाह सकते हैं।