Download presentation
Presentation is loading. Please wait.
Published byMelissa Prudence Grant Modified over 9 years ago
1
Recursive SQL Semra GÜLEÇ CENG 553 METU 30.12.2010
2
Agenda What is Recursion? Business Examples Mathematical Examples Performance Considerations Pitfalls & Recommendations CENG 553– Fall 2010Semra GÜLEÇ2
3
What Is Recursion? An algorithmic technique where a function, in order to accomplish a task, calls itself with some part of the task. Best known example is Factorial Calculation. n! = n * (n-1)! 4! = 4 * 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1 CENG 553– Fall 2010Semra GÜLEÇ3 1 2 * 1 3 * 2 4 * 624
4
Recursion in SQL Recursion seems “cool stuff”, but does it have any business value? CENG 553– Fall 2010Semra GÜLEÇ4
5
Where to Use Recursion? Bill of Materials (BOM) Hierarchies Organization Charts Airline/Transportation Reservation Systems Generate test data CENG 553– Fall 2010Semra GÜLEÇ5
6
BOM Example CENG 553– Fall 2010Semra GÜLEÇ6 AAA BBBCCCDDD EEEFFF GGG 153 24 3
7
Recursion Basics WITH RPL (PART, SUBPART, QUANTITY) AS (SELECT PART, SUBPART, QUANTITY FROM PARTLIST WHERE PART='AAA' UNION ALL SELECT CHILD.PART, CHILD.SUBPART, PARENT.QUANTITY*CHILD.QUANTITY FROM RPL PARENT, PARTLIST CHILD WHERE PARENT.SUBPART=CHILD.PART) SELECT PART, SUBPART, SUM(QUANTITY) AS QUANTITY FROM RPL GROUP BY PART, SUBPART ORDER BY PART, SUBPART 7 INITIALIZATION SELECT ITERATIVE SELECT MAIN SELECT
8
Result of Recursive SQL Result Of Initialization Select First iteration CENG 553– Fall 2010Semra GÜLEÇ8
9
Result of Recursive SQL Second and Final Iteration CENG 553– Fall 2010Semra GÜLEÇ9
10
Controlling the Depth of Recursion WITH RPL (LEVEL,PART, SUBPART ) AS (SELECT 0, PART, SUBPART FROM PARTLIST WHERE PART='AAA' UNION ALL SELECT PARENT.LEVEL+1,CHILD.PART, CHILD.SUBPART FROM RPL PARENT, PARTLIST CHILD WHERE PARENT.SUBPART=CHILD.PART AND PARENT.LEVEL < 1) SELECT LEVEL, PART, SUBPART FROM RPL ORDER BY LEVEL CENG 553– Fall 2010Semra GÜLEÇ10
11
Result of Recursive SQL CENG 553– Fall 2010Semra GÜLEÇ11
12
Loops in Hierarchy CENG 553– Fall 2010Semra GÜLEÇ12
13
Loop Detection SQL WITH PARENT (PART,SUBPART, LEVEL, PATH) AS (SELECT PART, SUBPART, 0, CAST(PART AS VARCHAR(100)) AS PATH FROM L_PARTLIST WHERE PART='AAA' UNION ALL SELECT CASE WHEN CHARINDEX(C.PART + '->',P.PATH)>0 THEN 'LOOP' ELSE C.PART END, C.SUBPART,P.LEVEL +1, CAST(P.PATH + '->' + P.SUBPART AS VARCHAR(100)) FROM L_PARTLIST C,PARENT P WHERE P.SUBPART = C.PART AND P.PART <> 'LOOP') SELECT DISTINCT PART, LEVEL, PATH FROM PARENT WHERE PART='LOOP' ORDER BY LEVEL CENG 553– Fall 2010Semra GÜLEÇ13
14
Finding the Cheapest Fare CENG 553– Fall 2010Semra GÜLEÇ14
15
Cheapest Fare SQL WITH ROUTING(LEVEL, FROM_CITY, TO_CITY, CHAIN, FARE) AS ( SELECT 0, CAST('' as char(3)), CAST('MCI' as char(3)), CAST('MCI' AS VARCHAR(100) ), 0 UNION ALL SELECT PARENT.LEVEL + 1, CHILD.FROM_CITY, CHILD.TO_CITY, CAST(PARENT.CHAIN + '->' + CHILD.TO_CITY as VARCHAR(100)), PARENT.FARE + CHILD.FARE FROM ROUTING PARENT, ROUTE CHILD WHERE PARENT.TO_CITY = CHILD.FROM_CITY AND PARENT.LEVEL < 10) CENG 553– Fall 2010Semra GÜLEÇ15
16
Cheapest Fare SQL – Cont SELECT DISTINCT CHAIN AS ROUTE, ROUTING.FARE FROM ROUTING WHERE ROUTING.LEVEL > 0 AND ROUTING.CHAIN LIKE 'MCI%' AND ROUTING.CHAIN LIKE '%DFW' ORDER BY ROUTE CENG 553– Fall 2010Semra GÜLEÇ16
17
Other Business Examples CENG 553– Fall 2010Semra GÜLEÇ17 Organization Chart Cost Roll-Up
18
Factorial Example WITH NUMBERS (LEVEL, FACTO) AS ( SELECT 1, 1 UNION ALL SELECT LEVEL + 1, FACTO * (LEVEL + 1) FROM NUMBERS WHERE LEVEL < 12 ) SELECT LEVEL AS NUMBER, FACTO AS FACTORIAL FROM NUMBERS ORDER BY LEVEL CENG 553– Fall 2010Semra GÜLEÇ18
19
Fibonacci Series WITH NUMBERS (LEVEL, NEXTNUM, TOTAL) AS (SELECT 1, 1, 1 UNION ALL SELECT LEVEL + 1, (NEXTNUM + TOTAL), (NEXTNUM + TOTAL + TOTAL) FROM NUMBERS WHERE LEVEL <= 10) SELECT A.NEXTNUM FROM NUMBERS A WHERE A.LEVEL <= 10 UNION ALL SELECT B.TOTAL FROM NUMBERS B WHERE B.LEVEL <= 10 ORDER BY 1 CENG 553– Fall 2010Semra GÜLEÇ19
20
Pitfalls & Recommendations Recursive SQL statements can be very efficient, if coded correctly, and if there are suitable indexes. When either of the above is not true, they can be very slow. Prone to infinite cycles unless controlled properly Always test on small test tables in test environment before deploying to production Use controls to limit recursion when possible CENG 553– Fall 2010Semra GÜLEÇ20
21
References DB2 SQL Cookbook, Graeme Birchall Recursive SQL – Unleash the Power!, IDUG North America 2008, Suresh Sane Parlez-Vous Klingon? Recursion SQL for Generating Test Data, IDUG Europe 2008, Alexander Kopac DB2 SQL Workshop for Experienced Users Course Notes, IBM Corp. CENG 553– Fall 2010Semra GÜLEÇ21
22
Thank You & Happy New Year CENG 553– Fall 2010Semra GÜLEÇ22
Similar presentations
© 2025 SlidePlayer.com Inc.
All rights reserved.