LIMIT TO limit-expression
LIMIT TO skip-expression
The LIMIT TO clause allows you to limit the number of rows
in the result table, or to skip rows returned from a query.
For example, the first row in the result set might be the
column headings loaded from a CSV data source loaded by the
RMU/LOAD/RECORD=FORMAT=DELIMITED command that should be ignored
by queries.
If either limit-expression or skip-expression is specified as a
numeric literal, then it must be an unscaled value. These numeric
expressions are converted to BIGINT before executing the query.
Neither limit-expression nor skip-expression can reference
columns from the select-expression in which they occur. You
can use only columns of a subselect specified for the limit-
expression or skip-expression. The example in this section uses a
subselect in the LIMIT TO clause.
NOTE
Oracle recommends that the values specified for skip-
expression be kept small for performance reasons. The
skipped rows are still fetched and processed by the query;
they are just not returned to the application.
If limit-expression is evaluated to a negative value or zero,
then no rows are returned from the query, and no error is
reported.
If skip-expression is evaluated to a negative value or zero, then
no rows are skipped. If the skip-expression is larger than the
rows in the result set, then no rows are returned from the query,
and no error is reported. The following examples show the use of
the LIMIT TO ... SKIP syntax.
This query returns the 100th employee from the EMPLOYEES table:
SQL> select last_name, first_name, employee_id
cont> from employees
cont> order by employee_id
cont> limit to 1 skip 99 rows;
LAST_NAME FIRST_NAME EMPLOYEE_ID
Herbener James 00471
1 row selected
To retrieve the last row in the sorted list, you can replace the
literal value with a subselect that calculates the value as shown
in the following example. This query also shows the output from
the SET FLAGS command for the query strategy.
SQL> set flags 'strategy,detail';
SQL> select last_name, first_name, employee_id
cont> from employees
cont> order by employee_id
cont> limit to 1
cont> skip (select count(*)-1 from employees) rows;
Tables:
0 = EMPLOYEES
1 = EMPLOYEES
Cross block of 2 entries
Cross block entry 1
Aggregate: 0:COUNT (*)
Index only retrieval of relation 1:EMPLOYEES
Index name EMP_EMPLOYEE_ID [0:0]
Cross block entry 2
Firstn: 1
Skipn: <agg0> - 1
Get Retrieval by index of relation 0:EMPLOYEES
Index name EMP_EMPLOYEE_ID [0:0]
LAST_NAME FIRST_NAME EMPLOYEE_ID
Herbener James 00471
1 row selected
SQL>
An alternative to this query would be to use ORDER ... DESC and
then to use a LIMIT 1 ROW clause.
This query finds the statistical median salary:
SQL> -- select the median salary
SQL> select salary_amount
cont> from salary_history
cont> where salary_end is NULL
cont> order by salary_amount
cont> limit to 1
cont> skip (select count(*)/2
cont> from salary_history
cont> where salary_end is NULL);
SALARY_AMOUNT
$24,166.00
1 row selected
SQL>
This result can be compared with the average salary:
SQL> -- select the median salary compare with average
SQL> select salary_amount as median_salary,
cont> (select avg (salary_amount)
cont> from salary_history
cont> where salary_end is NULL) as avg_salary edit using SALARY
cont> from salary_history
cont> where salary_end is NULL
cont> order by salary_amount
cont> limit to 1
cont> skip (select count(*)/2
cont> from salary_history
cont> where salary_end is NULL);
MEDIAN_SALARY AVG_SALARY
$24,166.00 $31,922.79
1 row selected
SQL>