MySQL के साथ oracle के समतुल्य


जवाबों:


16

वहाँ नही है। जब तक (कोई) इसे विकसित नहीं करता (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। अधिक जटिल प्रश्नों में, कोड को कई बार लिखना होगा।


पुनरावृत्ति (कोड के दोहराव) से बचने के लिए, क्या चर और अस्थायी तालिकाओं का उपयोग करना बेहतर नहीं होगा?
पचेरियर

मुझे कोड के दोहराव की चिंता नहीं होगी, लेकिन निश्चित रूप से मैं प्रदर्शन कारणों से अस्थायी तालिकाओं के साथ एक संस्करण पर विचार और प्रयास करूंगा।
ypercube y

1
आप ऐसा क्यों कहते हैं कि आपको कोड के दोहराव की चिंता नहीं होगी? यह एकमुश्त गड़बड़ है और संयुक्त राष्ट्र की  DRY है
पचेरियर

1
@ स्पेसर DRY हमेशा DB कोड के साथ प्रासंगिक नहीं है।
जेएनके

1
@ स्पेसर मुझे आश्चर्य नहीं होगा अगर यह नहीं थे। डीबी इंजनों को शिक्षित अनुमान लगाने की आवश्यकता है कि सही परिणाम वापस करने की गारंटी देते हुए क्या सबसे अच्छा काम करेगा। सामान्य रूप से टेंप टेबल ठीक है, लेकिन DRY अन्य प्रकार से DB में भयानक प्रदर्शन की ओर जाता है, जैसे उपयोगकर्ता परिभाषित कार्य।
जेएनके

2

यह काम करेगा, लेकिन यह एक दया है कि यह बिना क्लॉज़ का उपयोग करने का लाभ प्रदान नहीं करेगा, यह एक ही क्वेरी को कई बार निष्पादित नहीं करना है (जटिल प्रश्नों के साथ फिर से धीमी गति से और डेटाबेस इंजन के लिए बहुत मांग हो सकती है; मैंने इसे पीड़ित किया है) ।

मैं सुझाव दूंगा कि मूल में परिभाषित प्रत्येक SELECT को क्लॉज के साथ अपनी अस्थायी तालिका में डालें, और उन्हें क्वेरी के अंदर उपयोग करें । उपयोगकर्ता सत्र समाप्त होने के बाद, MySQL में, अस्थायी तालिका अपने आप गिर जाएगी।

संपादित करें:

मैंने बस एक समान सूत्र में इस उत्तर को देखा, जो स्पष्ट रूप से MySQL के साथ 3 वर्कअराउंड को उजागर करता है :

  • टेम्पररी टेबल
  • संचालित टेबल
  • इनलाइन विचार (प्रभावी रूप से क्लॉज का प्रतिनिधित्व करता है - वे विनिमेय हैं)

/programming//a/1382618/2906290

और MySQL प्रक्रिया का एक उदाहरण जो आपके सत्र के साथ जारी रहने पर अस्थायी तालिकाओं को बनाता और गिराता है और उन संसाधनों को मुक्त करना चाहता है (मैं इसे सिंटैक्स के उदाहरण के रूप में उपयोग करूंगा): /programming//a/ 5553145/2906290

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