चूंकि यह होमवर्क है, उत्तर के बजाय एक संकेत है। आप विश्लेषणात्मक कार्यों का उपयोग करना चाहेंगे। आप संबंधों को कैसे संभालना चाहते हैं, इसके आधार पर ROW_NUMBER, RANK, या DENSE_RANK काम कर सकते हैं।
यदि विश्लेषणात्मक कार्यों की भी अनुमति नहीं है, तो मैं दूसरे विकल्प की कल्पना कर सकता हूं-- एक जिसे आप कभी भी, कभी भी, वास्तव में कभी भी व्यवहार में नहीं लिखेंगे, वह कुछ ऐसा होगा
SELECT name, salary
FROM staff s1
WHERE (SELECT COUNT(*)
FROM staff s2
WHERE s1.salary < s2.salary) <= 3
प्रदर्शन के संबंध में, मैं क्वेरी योजना से लागत संख्या पर भरोसा नहीं करता-- यह केवल एक अनुमान है और विभिन्न SQL कथनों के लिए योजनाओं के बीच लागत की तुलना करना आम तौर पर संभव नहीं है। आप किसी चीज़ को देखने से बहुत बेहतर हैं जैसे कि क्वेरी की संख्या वास्तव में होती है और यह देखते हुए कि तालिका में पंक्तियों की संख्या बढ़ने पर क्वेरी का प्रदर्शन कैसे बढ़ेगा। तीसरा विकल्प अन्य दो की तुलना में मौलिक रूप से कम कुशल होने जा रहा है, क्योंकि इसे STAFF तालिका को दो बार स्कैन करने की आवश्यकता है।
मेरे पास आपकी STAFF तालिका नहीं है, इसलिए मैं SCOTT स्कीमा से EMP तालिका का उपयोग करूँगा
विश्लेषणात्मक फ़ंक्शन समाधान वास्तव में ROWNUM समाधान के समान 7 संगत प्राप्त करता है
Wrote file afiedt.buf
1 select ename, sal
2 from( select ename,
3 sal,
4 rank() over (order by sal) rnk
5 from emp )
6* where rnk <= 3
SQL> /
ENAME SAL
---------- ----------
smith 800
SM0 950
ADAMS 1110
Execution Plan
----------------------------------------------------------
Plan hash value: 3291446077
--------------------------------------------------------------------------------
-
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time
|
--------------------------------------------------------------------------------
-
| 0 | SELECT STATEMENT | | 14 | 672 | 4 (25)| 00:00:01
|* 1 | VIEW | | 14 | 672 | 4 (25)| 00:00:01
|* 2 | WINDOW SORT PUSHED RANK| | 14 | 140 | 4 (25)| 00:00:01
| 3 | TABLE ACCESS FULL | EMP | 14 | 140 | 3 (0)| 00:00:01
--------------------------------------------------------------------------------
-
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter("RNK"<=3)
2 - filter(RANK() OVER ( ORDER BY "SAL")<=3)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
668 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
3 rows processed
SQL> select ename, sal
2 from( select ename, sal
3 from emp
4 order by sal )
5 where rownum <= 3;
ENAME SAL
---------- ----------
smith 800
SM0 950
ADAMS 1110
Execution Plan
----------------------------------------------------------
Plan hash value: 1744961472
--------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 3 | 105 | 4 (25)| 00:00:01 |
|* 1 | COUNT STOPKEY | | | | | |
| 2 | VIEW | | 14 | 490 | 4 (25)| 00:00:01 |
|* 3 | SORT ORDER BY STOPKEY| | 14 | 140 | 4 (25)| 00:00:01 |
| 4 | TABLE ACCESS FULL | EMP | 14 | 140 | 3 (0)| 00:00:01 |
--------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter(ROWNUM<=3)
3 - filter(ROWNUM<=3)
Statistics
----------------------------------------------------------
1 recursive calls
0 db block gets
7 consistent gets
0 physical reads
0 redo size
668 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
1 sorts (memory)
0 sorts (disk)
3 rows processed
COUNT(*) समाधान, हालांकि, वास्तव में 99 सुसंगत हो जाता है और तालिका का पूर्ण स्कैन दो बार करना पड़ता है, इसलिए यह 10 गुना कम कुशल है। और तालिका में पंक्तियों की संख्या बढ़ने पर यह और भी खराब हो जाएगी
SQL> select ename, sal
2 from emp e1
3 where (select count(*) from emp e2 where e1.sal < e2.sal) <= 3;
ENAME SAL
---------- ----------
JONES 2975
SCOTT 3000
KING 5000
FORD 3000
FOO
Execution Plan
----------------------------------------------------------
Plan hash value: 2649664444
----------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 14 | 140 | 24 (0)| 00:00:01 |
|* 1 | FILTER | | | | | |
| 2 | TABLE ACCESS FULL | EMP | 14 | 140 | 3 (0)| 00:00:01 |
| 3 | SORT AGGREGATE | | 1 | 4 | | |
|* 4 | TABLE ACCESS FULL| EMP | 1 | 4 | 3 (0)| 00:00:01 |
----------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
1 - filter( (SELECT COUNT(*) FROM "EMP" "E2" WHERE
"E2"."SAL">:B1)<=3)
4 - filter("E2"."SAL">:B1)
Statistics
----------------------------------------------------------
0 recursive calls
0 db block gets
99 consistent gets
0 physical reads
0 redo size
691 bytes sent via SQL*Net to client
524 bytes received via SQL*Net from client
2 SQL*Net roundtrips to/from client
0 sorts (memory)
0 sorts (disk)
5 rows processed