Oracle Database SQL Certified Associate
1 Introduction to SQL
1-1 Overview of SQL
1-2 History of SQL
1-3 SQL Standards
2 SQL Data Types
2-1 Numeric Data Types
2-2 Character Data Types
2-3 Date and Time Data Types
2-4 Large Object (LOB) Data Types
2-5 Miscellaneous Data Types
3 Creating and Managing Tables
3-1 Creating Tables
3-2 Modifying Tables
3-3 Dropping Tables
3-4 Table Constraints
3-5 Temporary Tables
4 Data Manipulation Language (DML)
4-1 Inserting Data
4-2 Updating Data
4-3 Deleting Data
4-4 Selecting Data
4-5 Using Subqueries
5 Data Control Language (DCL)
5-1 Granting Privileges
5-2 Revoking Privileges
6 Data Definition Language (DDL)
6-1 Creating Tables
6-2 Altering Tables
6-3 Dropping Tables
6-4 Creating Indexes
6-5 Dropping Indexes
6-6 Creating Views
6-7 Dropping Views
7 SQL Functions
7-1 Single-Row Functions
7-2 Aggregate Functions
7-3 Group Functions
7-4 Analytical Functions
8 Joins and Subqueries
8-1 Inner Joins
8-2 Outer Joins
8-3 Self-Joins
8-4 Cross Joins
8-5 Subqueries
9 Set Operators
9-1 UNION
9-2 UNION ALL
9-3 INTERSECT
9-4 MINUS
10 Grouping and Aggregation
10-1 GROUP BY Clause
10-2 HAVING Clause
10-3 ROLLUP and CUBE
10-4 GROUPING SETS
11 Transactions and Concurrency
11-1 Transaction Control Statements
11-2 Locking and Concurrency
11-3 Isolation Levels
12 Oracle SQL Developer
12-1 Overview of Oracle SQL Developer
12-2 Using SQL Worksheet
12-3 Managing Connections
12-4 Running Scripts
13 Advanced SQL Topics
13-1 Recursive Queries
13-2 Model Clause
13-3 PIVOT and UNPIVOT
13-4 Flashback Query
14 Performance Tuning
14-1 Query Optimization
14-2 Indexing Strategies
14-3 Analyzing Query Performance
15 Security and Auditing
15-1 User Management
15-2 Role Management
15-3 Auditing SQL Statements
16 Backup and Recovery
16-1 Backup Strategies
16-2 Recovery Strategies
16-3 Using RMAN
17 Oracle Database Architecture
17-1 Overview of Oracle Database Architecture
17-2 Memory Structures
17-3 Process Structures
17-4 Storage Structures
18 PLSQL Basics
18-1 Introduction to PLSQL
18-2 PLSQL Block Structure
18-3 Variables and Data Types
18-4 Control Structures
18-5 Exception Handling
19 Oracle SQL Certification Exam Preparation
19-1 Exam Objectives
19-2 Sample Questions
19-3 Practice Tests
19-4 Exam Tips
Recursive Queries in Oracle SQL

Recursive Queries in Oracle SQL

Key Concepts

Recursive Queries in Oracle SQL allow you to perform recursive operations on hierarchical data. Understanding the following key concepts is essential for effectively using recursive queries:

1. Common Table Expressions (CTEs)

A Common Table Expression (CTE) is a temporary result set that you can reference within a SELECT, INSERT, UPDATE, or DELETE statement. CTEs are particularly useful for defining recursive queries.

2. Recursive CTEs

A Recursive CTE is a CTE that references itself, allowing you to perform recursive operations. It consists of an anchor member and a recursive member.

3. Anchor Member

The anchor member is the initial query that provides the base result set for the recursion. It does not reference the CTE itself.

4. Recursive Member

The recursive member is the query that references the CTE itself. It iteratively builds on the result set provided by the anchor member.

5. UNION ALL

The UNION ALL operator is used to combine the results of the anchor member and the recursive member. It ensures that all rows from both members are included in the final result set.

6. Termination Condition

The termination condition is the criteria that stops the recursion. It ensures that the recursive query does not run indefinitely.

Detailed Explanation

1. Common Table Expressions (CTEs)

CTEs are defined using the WITH clause. They provide a way to write auxiliary statements for use in a larger query. For example:

WITH EmployeeCTE AS ( SELECT EmployeeID, ManagerID, EmployeeName FROM Employees WHERE ManagerID IS NULL ) SELECT * FROM EmployeeCTE;

2. Recursive CTEs

Recursive CTEs are defined by combining an anchor member and a recursive member using the UNION ALL operator. For example:

WITH EmployeeCTE AS ( SELECT EmployeeID, ManagerID, EmployeeName FROM Employees WHERE ManagerID IS NULL UNION ALL SELECT e.EmployeeID, e.ManagerID, e.EmployeeName FROM Employees e INNER JOIN EmployeeCTE m ON e.ManagerID = m.EmployeeID ) SELECT * FROM EmployeeCTE;

3. Anchor Member

The anchor member provides the initial set of rows for the recursion. It does not reference the CTE itself. For example:

SELECT EmployeeID, ManagerID, EmployeeName FROM Employees WHERE ManagerID IS NULL

4. Recursive Member

The recursive member references the CTE itself and iteratively builds on the result set provided by the anchor member. For example:

SELECT e.EmployeeID, e.ManagerID, e.EmployeeName FROM Employees e INNER JOIN EmployeeCTE m ON e.ManagerID = m.EmployeeID

5. UNION ALL

The UNION ALL operator combines the results of the anchor member and the recursive member. It ensures that all rows from both members are included in the final result set. For example:

UNION ALL

6. Termination Condition

The termination condition stops the recursion when no more rows can be added to the result set. This is implicitly handled by the recursive member's join condition. For example:

INNER JOIN EmployeeCTE m ON e.ManagerID = m.EmployeeID

Examples and Analogies

Example 1: Organizational Hierarchy

Imagine you have an organizational hierarchy where each employee reports to a manager. You can use a recursive query to list all employees and their managers, including the top-level manager:

WITH EmployeeCTE AS ( SELECT EmployeeID, ManagerID, EmployeeName FROM Employees WHERE ManagerID IS NULL UNION ALL SELECT e.EmployeeID, e.ManagerID, e.EmployeeName FROM Employees e INNER JOIN EmployeeCTE m ON e.ManagerID = m.EmployeeID ) SELECT * FROM EmployeeCTE;

Example 2: Family Tree

Consider a family tree where each person has a parent. You can use a recursive query to list all descendants of a particular ancestor:

WITH FamilyCTE AS ( SELECT PersonID, ParentID, PersonName FROM Family WHERE ParentID IS NULL UNION ALL SELECT f.PersonID, f.ParentID, f.PersonName FROM Family f INNER JOIN FamilyCTE p ON f.ParentID = p.PersonID ) SELECT * FROM FamilyCTE;

Example 3: Folder Structure

Imagine a folder structure where each folder can contain subfolders. You can use a recursive query to list all folders and their subfolders:

WITH FolderCTE AS ( SELECT FolderID, ParentFolderID, FolderName FROM Folders WHERE ParentFolderID IS NULL UNION ALL SELECT f.FolderID, f.ParentFolderID, f.FolderName FROM Folders f INNER JOIN FolderCTE p ON f.ParentFolderID = p.FolderID ) SELECT * FROM FolderCTE;