I don't see any benefit of using sub-query factoring(WITH clause) here. The query could simply be written as:
SELECT member_id
FROM Enrollments e
WHERE e.enrollment_cost =
(SELECT MAX (enrollment_cost) FROM Enrollments
);
Compare the explain plans:
Without sub-query factoring:
SQL> set autot on explain
SQL> SELECT empno FROM emp e WHERE e.sal =
2 (SELECT MAX (sal) FROM emp
3 );
EMPNO
----------
7839
Execution Plan
----------------------------------------------------------
Plan hash value: 1876299339
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 8 | 8 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL | EMP | 1 | 8 | 4 (0)| 00:00:01 |
| 2 | SORT AGGREGATE | | 1 | 4 | | |
| 3 | TABLE ACCESS FULL| EMP | 14 | 56 | 4 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("E"."SAL"= (SELECT MAX("SAL") FROM "EMP" "EMP"))
With sub-query factoring:
SQL> WITH max_sal AS
2 ( SELECT MAX (sal) sal FROM emp
3 )
4 SELECT empno FROM emp e WHERE e.sal =
5 (SELECT sal FROM max_sal
6 );
EMPNO
----------
7839
Execution Plan
----------------------------------------------------------
Plan hash value: 73843676
-----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
-----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 8 | 8 (0)| 00:00:01 |
|* 1 | TABLE ACCESS FULL | EMP | 1 | 8 | 4 (0)| 00:00:01 |
| 2 | VIEW | | 1 | 13 | 4 (0)| 00:00:01 |
| 3 | SORT AGGREGATE | | 1 | 4 | | |
| 4 | TABLE ACCESS FULL| EMP | 14 | 56 | 4 (0)| 00:00:01 |
-----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("E"."SAL"= (SELECT "SAL" FROM (SELECT MAX("SAL") "SAL"
FROM "EMP" "EMP") "MAX_SAL"))
See the filter applied, all you are doing is making it nested query and going one level deep without actually adding any benefit.
most_expensivein your query - only a sub-query. But you refer to a column of that name in yourwhereclause