कॉमन टेबल एक्सप्रेशंस, या संक्षेप में सीटीई, रिकॉर्ड्स का एक अस्थायी सेट बनाने की एक तकनीक है जिसे एक INSERT, SELECT, UPDATE या DELETE स्टेटमेंट में संदर्भित किया जा सकता है।
SQL सर्वर 2005 में Microsoft द्वारा सामान्य तालिका अभिव्यक्तियाँ पेश की गई थीं। वे डेटाबेस मेमोरी में ऑब्जेक्ट के रूप में संग्रहीत नहीं हैं क्योंकि उनका जीवनकाल क्वेरी के निष्पादन समय के बराबर है। जैसे ही कोई क्वेरी पूरी होती है, उन्हें डेटाबेस मेमोरी से हटा दिया जाता है। सीटीई को एक प्रश्न में जितनी बार चाहें संदर्भित किया जा सकता है और वे स्वयं-संदर्भित भी हो सकते हैं।
आइए एक छात्र तालिका के साथ एक डेटाबेस बनाएं और उसमें कुछ डमी छात्र रिकॉर्ड डालें। हम इस डेटाबेस का उपयोग सीटीई प्रश्नों को लिखने के लिए करेंगे। हमेशा की तरह नए कोड के साथ प्रयोग करने से पहले सुनिश्चित करें कि आपने अच्छी तरह से बैकअप लिया है। यदि आप सुनिश्चित नहीं हैं तो SQL बैकअप पर यह लेख देखें।
अपने सर्वर पर निम्नलिखित प्रश्नों को निष्पादित करें।
CREATE DATABASE schooldb CREATE TABLE student ( id INT PRIMARY KEY, name VARCHAR(50) NOT NULL, gender VARCHAR(50) NOT NULL, DOB datetime NOT NULL, total_score INT NOT NULL, ) INSERT INTO student VALUES (1, 'Jolly', 'Female', '12-JUN-1989', 500), (2, 'Jon', 'Male', '02-FEB-1974', 545), (3, 'Sara', 'Female', '07-MAR-1988', 600), (4, 'Laura', 'Female', '22-DEC-1981', 400), (5, 'Alan', 'Male', '29-JUL-1993', 500), (6, 'Kate', 'Female', '03-JAN-1985', 500), (7, 'Joseph', 'Male', '09-APR-1982', 643), (8, 'Mice', 'Male', '16-AUG-1974', 543), (9, 'Wise', 'Male', '11-NOV-1987', 499), (10, 'Elis', 'Female', '28-OCT-1990', 400);
अब, एक बहुत ही सरल सामान्य तालिका व्यंजक बनाते हैं। इस सीटीई में 1 जनवरी 1985 से पहले पैदा हुए सभी छात्रों के रिकॉर्ड होंगे। निम्नलिखित स्क्रिप्ट पर एक नज़र डालें।
USE schooldb; WITH OldStudents AS ( SELECT * FROM student WHERE DOB < '1985-01-01' )
CTE बनाने के लिए, आपको 'WITH' कीवर्ड के साथ CTE और 'AS' कीवर्ड के नाम से शुरुआत करनी होगी।
इसके बाद, कोष्ठक के भीतर, आपको वह क्वेरी लिखनी होगी जो उन रिकॉर्ड्स को लौटाती है जिन्हें CTE अस्थायी रूप से संग्रहीत करेगा। उपरोक्त लिपि में, हमने "ओल्डस्टूडेंट्स" नामक एक सीटीई बनाया।
हालाँकि, ध्यान दें कि यदि आप उपरोक्त क्वेरी को निष्पादित करने का प्रयास करते हैं, तो आपको एक त्रुटि मिलेगी। ऐसा इसलिए है क्योंकि एक बार जब आप एक सीटीई बना लेते हैं, तो आपको तुरंत उसका उपयोग करना होता है।
आइए हमारे नए बनाए गए "ओल्डस्टूडेंट्स" सीटीई से सभी रिकॉर्ड्स का चयन करें। अपने सर्वर पर निम्न स्क्रिप्ट आज़माएं।
USE schooldb; WITH OldStudents AS ( SELECT * FROM student WHERE DOB < '1985-01-01' ) SELECT * FROM OldStudents
उपरोक्त स्क्रिप्ट रिकॉर्ड के निम्नलिखित सेट को पुनः प्राप्त करेगी:
CTE के माध्यम से सकल गणना करना
तालिकाओं की तरह, आप सीटीई पर समग्र कार्य कर सकते हैं। आइए सीटीई के दूसरे उदाहरण पर एक नजर डालते हैं।
USE schooldb; WITH SumofScores AS ( SELECT gender, SUM(total_score) as SumScore FROM student GROUP BY gender ) SELECT AVG (SumScore) FROM SumofScores
उपरोक्त उदाहरण में, हमने एक सीटीई बनाया है जिसका नाम सुमोफस्कोर है। इस सीटीई में छात्र तालिका के कुल_स्कोर कॉलम में संग्रहीत मानों का योग होता है। परिणाम लिंग कॉलम द्वारा समूहीकृत किया जाता है। CTE द्वारा संग्रहीत डेटा मेमोरी में इस तरह दिखता है:
इसके बाद, हमने सीटीई के "समस्कोर" कॉलम पर एवीजी फ़ंक्शन का प्रदर्शन किया। स्क्रिप्ट का अंतिम परिणाम 2400 और 2730 का औसत यानी 2565 होगा।
यह पिछले उदाहरण की तुलना में थोड़ा अधिक जटिल है लेकिन सीटीई की अवधारणा को अधिक स्पष्ट रूप से प्रदर्शित करता है।
CTE में कॉलम लेबल करना
पिछले उदाहरण में, हमने सीटीई के दूसरे कॉलम में एक उपनाम जोड़ा। हमने इसका नाम बदलकर "समस्कोर" कर दिया। यह CTE में कॉलम को लेबल करने का एक तरीका है और यह टेबल कॉलम एलियासेस के समान है।
हालांकि, सीटीई में कॉलम नामों को परिभाषित करने का एक और तरीका है। निम्न क्वेरी पर एक नज़र डालें।
USE schooldb; WITH SumofScores(Gender, SumScore) AS ( SELECT gender, SUM(total_score) FROM student GROUP BY gender ) SELECT AVG (SumScore) From SumofScores
इस स्क्रिप्ट में, हमने CTE नाम के बाद कोष्ठक में “SumofScores” CTE के कॉलम नाम जोड़े। प्रत्येक स्तंभ का नाम अल्पविराम द्वारा अलग किया जाता है।
यदि आप CTE के बाद SELECT स्टेटमेंट को देखते हैं, तो आप देख सकते हैं कि हम "SumScore" कॉलम को संदर्भित कर रहे हैं जिसे हमने CTE नाम के बाद कोष्ठक में बनाया है।
एकाधिक CTE बनाना
अब तक के सभी उदाहरणों में स्पष्टता के लिए केवल एक ही सामान्य तालिका व्यंजक का उपयोग किया गया है। आप एक ही समय में सीटीई की एक सूची बना सकते हैं और फिर अंतिम परिणाम सेट में संयोजन में उन सभी का उपयोग कर सकते हैं।
इसे एक उदाहरण की मदद से सबसे अच्छी तरह से समझाया गया है। नीचे दी गई स्क्रिप्ट पर एक नज़र डालें।
यहां हम दो सीटीई बनाएंगे। पहला सीटीई 1 जनवरी 1985 से पहले पैदा हुए छात्रों के सभी रिकॉर्ड संग्रहीत करेगा। दूसरे सीटीई में 1 जनवरी 1985 को या उसके बाद पैदा हुए छात्रों के सभी रिकॉर्ड होंगे।
उसके बाद, हम दोनों सीटीई से सभी रिकॉर्ड प्राप्त करने के लिए चुनिंदा बयानों का उपयोग करेंगे। पुनर्प्राप्त किए गए रिकॉर्ड्स को UNION स्टेटमेंट का उपयोग करके एक साथ मिला दिया जाएगा। अंत में, मर्ज किए गए रिकॉर्ड को जन्म तिथि के आरोही क्रम में क्रमबद्ध किया जाएगा।
USE schooldb; WITH OldStudents AS ( SELECT * FROM student WHERE DOB < '1985-01-01' ), YoungStudents AS ( SELECT * FROM student WHERE DOB >= '1985-01-01' ) (SELECT * FROM OldStudents UNION SELECT * FROM YoungStudents) ORDER BY DOB
उपरोक्त SQL क्वेरी में, हमने दो CTE बनाए:"OldStudents" और "YoungStudents"। यह उल्लेखनीय है कि आपको प्रत्येक सीटीई के साथ "साथ" कीवर्ड का उपयोग करने की आवश्यकता नहीं है। आपको केवल स्क्रिप्ट में पहले CTE से पहले इसका उपयोग करने की आवश्यकता है, उसके बाद आप कितने भी CTE को अल्पविराम से अलग करके बना सकते हैं।
उपरोक्त स्क्रिप्ट निम्नलिखित परिणाम प्राप्त करती है: