<पी> एक रिकर्सिव सीटीई (कॉमन टेबल एक्सप्रेशन) एक सबक्वेरी है जो अपने नाम का उपयोग करके खुद को संदर्भित करता है। इसे WITH RECURSIVE का उपयोग करके परिभाषित किया गया है और एक समाप्ति शर्त होनी चाहिए। पुनरावर्ती CTE श्रृंखला उत्पन्न करने, पदानुक्रमित डेटा को पार करने और ग्राफ़ ट्रैवर्सल के लिए उपयोगी हैं। सिंटेक्स
WITH RECURSIVE cte_name (col1, col2, ...) AS (
-- Non-recursive (base case): initial rows
SELECT col1, col2 FROM table_name
UNION ALL
-- Recursive case: references cte_name
SELECT col1, col2 FROM cte_name WHERE condition
)
SELECT * FROM cte_name;
- पहला
SELECT बेस केस प्रारंभिक पंक्तियाँ प्रदान करता है।
UNION ALL प्रत्येक पुनरावृत्ति से पंक्तियाँ जोड़ता है (DISTINCT डुप्लिकेट हटाता है).
- दूसरा
SELECT पुनरावर्ती मामला तब तक चलता है जब तक WHERE स्थिति विफल नहीं हो जाती।
उदाहरण 1:पहले 5 विषम संख्याएँ उत्पन्न करें
WITH RECURSIVE odd_no (sr_no, n) AS (
SELECT 1, 1
UNION ALL
SELECT sr_no + 1, n + 2
FROM odd_no
WHERE sr_no < 5
)
SELECT * FROM odd_no;
+-------+---+
| sr_no | n |
+-------+---+
| 1 | 1 |
| 2 | 3 |
| 3 | 5 |
| 4 | 7 |
| 5 | 9 |
+-------+---+
<पी> बेस केस रिटर्न (1, 1)। प्रत्येक पुनरावृत्ति sr_no को 1 से और n को 2 से बढ़ाती है। जब sr_no 5 तक पहुँच जाता है तो पुनरावर्तन रुक जाता है। उदाहरण 2:कर्मचारी पदानुक्रम
<पी> प्रबंधक-कर्मचारी पदानुक्रम को पार करने का अधिक व्यावहारिक उपयोग?
-- Assume: employees(id, name, manager_id)
WITH RECURSIVE org_chart (id, name, level) AS (
-- Base: top-level manager (no manager)
SELECT id, name, 0
FROM employees
WHERE manager_id IS NULL
UNION ALL
-- Recursive: find direct reports
SELECT e.id, e.name, oc.level + 1
FROM employees e
JOIN org_chart oc ON e.manager_id = oc.id
)
SELECT * FROM org_chart ORDER BY level;
<पी> यह शीर्ष-स्तरीय प्रबंधक (स्तर 0) से शुरू होकर एक संगठनात्मक वृक्ष बनाता है और प्रत्येक स्तर पर सभी रिपोर्टों को पुनरावर्ती रूप से पाता है। मुख्य बिंदु
- अनंत लूप से बचने के लिए पुनरावर्ती SELECT के WHERE क्लॉज में हमेशा एक समाप्ति शर्त शामिल करें।
- MySQL की डिफ़ॉल्ट रिकर्सन सीमा 1000 पुनरावृत्तियों की है (
cte_max_recursion_depth के माध्यम से कॉन्फ़िगर करने योग्य) ).
-
UNION ALL का उपयोग करें प्रदर्शन के लिए; UNION DISTINCT केवल तभी जब डुप्लिकेट को हटाया जाना चाहिए।
निष्कर्ष
<पी> पुनरावर्ती CTEs WITH RECURSIVE का उपयोग करते हैं बेस केस और रिकर्सिव केस के साथ स्व-संदर्भित प्रश्नों को परिभाषित करना। वे MySQL में पदानुक्रमित डेटा ट्रैवर्सल (संगठन चार्ट, श्रेणी पेड़), श्रृंखला निर्माण और ग्राफ़ ट्रैवर्सल के लिए आवश्यक हैं। <पी>