EXPERT RESPONSE
This type of question gets asked all the time.
Perhaps if we answer it again, using
"FIRST N rows, TOP N rows, LAST N rows, BOTTOM N rows..."
to describe the problem, it will be easier to find
when you search the site.
First, we must establish one important fact:
|
There is no order in a relational table!
There is no first row, or last row. Rows are
stored in no particular sequence, so if you want the first
ten, or the last ten, the question only makes sense if you
phrase it in terms of the values of a particular column.
|
That having been said, it is indeed
possible for a table to have a sequence,
but only if a clustering index has been defined,
so that the rows are stored by the value of the index column,
most of the time (physical sequence is not guaranteed,
but logical sequence is). If you want a result set in a specific sequence,
you are nevertheless still urged to rely on the ORDER BY
clause.
Okay, to business.
If you are using Microsoft SQL Server or Access, use the
TOP keyword and an ORDER BY clause, like this --
select top 10
foo
, bar
from yourtable
order
by foo desc
In this example, you will get the rows that have the highest ten
foo values, because the ORDER BY sorts the rows into descending sequence,
so the highest come first. If you want the bottom ten instead, don't code
BOTTOM instead of TOP (because there's no such keyword as BOTTOM), just
use ASC instead of DESC in the ORDER BY.
If you are using MySQL or PostgreSQL, use the
LIMIT keyword and an ORDER BY clause, like this --
select foo
, bar
from yourtable
order
by foo desc
limit 10
Again, if you want the bottom ten, use ASC in the ORDER BY.
If you are using DB2, use the
FETCH FIRST clause, as explained in
Last N rows in DB2 (3 October 2002).
If you are using Oracle, you can use a special trick
to get row numbers --
select *
from ( select foo
, bar
from yourtable
order
by foo desc )
where rownum <= 10
Finally, if you are using none of the above, try the
generic top 10 query:
select foo
, bar
from yourtable X
where ( select count(*)
from yourtable
where foo > X.foo ) < 10
You will notice that there is no ORDER BY clause.
Nevertheless, sequencing on the foo column is assumed, as
you can see in the subquery. The subquery counts
the number of rows that have a foo value
that is greater than the one under consideration
in the outer query; if that count is less than
ten, then the row under consideration
must be in the top ten. To get the bottom ten,
reverse the inequality in the subquery.
|