पुनरावर्ती प्रश्नों को लागू करने का SQL मानक तरीका, जैसा कि लागू किया गया है उदा। IBM DB2 और SQL सर्वर द्वारा, WITH
. है खंड। CONNECT BY
. के अनुवाद के एक उदाहरण के लिए यह लेख देखें एक WITH
. में (तकनीकी रूप से एक पुनरावर्ती सीटीई ) -- उदाहरण DB2 के लिए है लेकिन मेरा मानना है कि यह SQL सर्वर पर भी काम करेगा।
संपादित करें:स्पष्ट रूप से मूल क्वेरेंट को एक विशिष्ट उदाहरण की आवश्यकता होती है, यहां आईबीएम साइट से एक है जिसका यूआरएल मैंने पहले ही दिया है। एक टेबल दिया गया:
CREATE TABLE emp(empid INTEGER NOT NULL PRIMARY KEY,
name VARCHAR(10),
salary DECIMAL(9, 2),
mgrid INTEGER);
जहां mgrid
किसी कर्मचारी के प्रबंधक के empid
. का संदर्भ देता है , कार्य है, उन सभी के नाम प्राप्त करना जो प्रत्यक्ष या परोक्ष रूप से Joan
. को रिपोर्ट करते हैं . Oracle में, यह एक आसान CONNECT
है :
SELECT name
FROM emp
START WITH name = 'Joan'
CONNECT BY PRIOR empid = mgrid
SQL सर्वर, IBM DB2, या PostgreSQL 8.4 (साथ ही SQL मानक में, जो इसके लायक है;-) में, पूरी तरह से समकक्ष समाधान इसके बजाय एक पुनरावर्ती क्वेरी (अधिक जटिल सिंटैक्स, लेकिन, वास्तव में, और भी अधिक शक्ति और लचीलापन है) ):
WITH n(empid, name) AS
(SELECT empid, name
FROM emp
WHERE name = 'Joan'
UNION ALL
SELECT nplus1.empid, nplus1.name
FROM emp as nplus1, n
WHERE n.empid = nplus1.mgrid)
SELECT name FROM n
Oracle का START WITH
क्लॉज पहला नेस्टेड बन जाता है SELECT
, रिकर्सन का मूल मामला, UNION
. होना चाहिए रिकर्सिव भाग के साथ एड जो सिर्फ एक और SELECT
है ।
SQL सर्वर का विशिष्ट स्वाद WITH
बेशक MSDN पर प्रलेखित है, जो इस कीवर्ड के उपयोग के लिए दिशानिर्देश और सीमाएं, साथ ही साथ कई उदाहरण भी देता है।