我沒有看到使用子查詢融通(WITH子句)在這裏的任何好處。查詢可以簡單地寫爲:
SELECT member_id
FROM Enrollments e
WHERE e.enrollment_cost =
(SELECT MAX (enrollment_cost) FROM Enrollments
);
比較解釋計劃:
無子查詢保:
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"))
隨着子查詢的保理:
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"))
請參閱應用的過濾器,您所做的只是將其嵌套查詢並深入一層,而不實際添加任何好處。
您的查詢中沒有_column_ name'most_expensive' - 只有一個子查詢。但是你在你的'where'子句中提到了這個名字的列 –