वहाँ Oracle में विराम खंड के बराबर एक MySQL है?
वहाँ Oracle में विराम खंड के बराबर एक MySQL है?
जवाबों:
वहाँ नही है। जब तक (कोई) इसे विकसित नहीं करता (MySQL ओपन-सोर्स है, कोई भी योगदान कर सकता है।)
ANSI / ISO SQL WITH
कीवर्ड का उपयोग कॉमन टेबल एक्सप्रेशंस (CTE) को परिभाषित करने के लिए किया जाता है और यह एक या कई शून्य संदर्भों के साथ जटिल प्रश्नों को सरल करता है। यह Oracle, Postgres, SQL-Server, DB2 में उपलब्ध है लेकिन MySQL में नहीं।
अंतिम क्वेरी में संदर्भ हो सकते हैं (आमतौर पर FROM
खंड में लेकिन वे किसी भी अन्य भाग में हो सकते हैं) सामान्य तालिका अभिव्यक्तियों में से किसी एक या अधिक बार। व्युत्पन्न तालिकाओं का उपयोग करके MySQL में क्वेरी (CTE के बिना) लिखी जा सकती है लेकिन संदर्भों को बार-बार बनाना पड़ता है।
एक मूर्खतापूर्ण क्वेरी का उदाहरण जो 50 के दशक में और जुलाई के महीने में पैदा हुए सभी लोगों को दिखा रहा है और एक ही समय में पैदा हुए सभी व्यक्तियों की संख्या:
WITH a AS
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
)
, b AS
( SELECT birthyear, COUNT(*) AS cnt
FROM a
GROUP BY birthyear
)
SELECT a.name, a.birthdate, b.cnt AS number_of_births
FROM a JOIN b
ON a.birthyear = b.birthyear
WHERE MONTH(a.birthdate) = 7 ;
MySQL में, इसे इस प्रकार लिखा जा सकता है:
SELECT a.name, a.birthdate, b.cnt AS number_of_births
FROM
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
) AS a
JOIN
( SELECT birthyear, COUNT(*) AS cnt
FROM
( SELECT name, birthdate, YEAR(birthdate) AS birthyear
FROM persons
WHERE birthdate >= '1950-01-01' AND birthdate < '1960-01-01'
) AS aa
GROUP BY birthyear
) AS b
ON a.birthyear = b.birthyear
WHERE MONTH(a.birthdate) = 7 ;
व्युत्पन्न तालिका के लिए कोड के दोहराव पर ध्यान दें a
। अधिक जटिल प्रश्नों में, कोड को कई बार लिखना होगा।
यह काम करेगा, लेकिन यह एक दया है कि यह बिना क्लॉज़ का उपयोग करने का लाभ प्रदान नहीं करेगा, यह एक ही क्वेरी को कई बार निष्पादित नहीं करना है (जटिल प्रश्नों के साथ फिर से धीमी गति से और डेटाबेस इंजन के लिए बहुत मांग हो सकती है; मैंने इसे पीड़ित किया है) ।
मैं सुझाव दूंगा कि मूल में परिभाषित प्रत्येक SELECT को क्लॉज के साथ अपनी अस्थायी तालिका में डालें, और उन्हें क्वेरी के अंदर उपयोग करें । उपयोगकर्ता सत्र समाप्त होने के बाद, MySQL में, अस्थायी तालिका अपने आप गिर जाएगी।
संपादित करें:
मैंने बस एक समान सूत्र में इस उत्तर को देखा, जो स्पष्ट रूप से MySQL के साथ 3 वर्कअराउंड को उजागर करता है :
/programming//a/1382618/2906290
और MySQL प्रक्रिया का एक उदाहरण जो आपके सत्र के साथ जारी रहने पर अस्थायी तालिकाओं को बनाता और गिराता है और उन संसाधनों को मुक्त करना चाहता है (मैं इसे सिंटैक्स के उदाहरण के रूप में उपयोग करूंगा): /programming//a/ 5553145/2906290