SQL> select *
2 from (SELECT /*+index_desc(STA_1 T_STATEMENTDEN)*/ STA_1.STATEMENT_ID,
3 STA_1.BALANCE_ON_ENTRY,
4 STA_1.BALANCE_ON_EXIT
5 FROM T_STATEMENT STA_1
6 WHERE (STA_1.OBJECT_MAIN, STA_1.STATEMENT_TYPE_ID) = (select '40817810614001014481', 1 from dual)
7 AND (STA_1.STATEMENT_ID < 23739975)
8 ORDER BY STA_1.STATEMENT_ID DESC)
9 where rownum <= 1;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=5 Card=1 Bytes=39)
1 0 COUNT (STOPKEY)
2 1 VIEW (Cost=5 Card=6 Bytes=234)
3 2 SORT (ORDER BY STOPKEY) (Cost=5 Card=6 Bytes=246)
4 3 TABLE ACCESS (BY GLOBAL INDEX ROWID) OF 'T_STATEMENT' (Cost=4 Card=6 Bytes=246)
5 4 INDEX (RANGE SCAN DESCENDING) OF 'T_STATEMENTDEN' (NON-UNIQUE) (Cost=3 Card=6)
6 5 TABLE ACCESS (FULL) OF 'DUAL' (Cost=20 Card=8168)
ну не может = (select) вернуть больше одной строки, даже если Card не 8168, а 1, все равно тоже самое.
SQL> select *
2 from (SELECT STA_1.STATEMENT_ID,
3 STA_1.BALANCE_ON_ENTRY,
4 STA_1.BALANCE_ON_EXIT
5 FROM T_STATEMENT STA_1
6 WHERE (STA_1.OBJECT_MAIN = '40817810614001014481')
7 and (STA_1.STATEMENT_TYPE_ID = 1)
8 AND (STA_1.STATEMENT_ID < 23739975)
9 ORDER BY STA_1.STATEMENT_ID DESC)
10 where rownum <= 1;
Execution Plan
----------------------------------------------------------
0 SELECT STATEMENT Optimizer=CHOOSE (Cost=4 Card=1 Bytes=39)
1 0 COUNT (STOPKEY)
2 1 VIEW (Cost=4 Card=6 Bytes=234)
3 2 TABLE ACCESS (BY GLOBAL INDEX ROWID) OF 'T_STATEMENT' (Cost=4 Card=6 Bytes=246)
4 3 INDEX (RANGE SCAN DESCENDING) OF 'T_STATEMENTDEN' (NON-UNIQUE) (Cost=3 Card=6)
9.2.0.8