这篇文章写的很精彩,通俗易懂,本人按该方法做了一下试验.
数据库采用Oracle9i,建立雇员表employee,只包含两个字段 ID、NAME(其中ID具有UNIQUE约束),并向
表中插入20条数据。
一、假设现在要查询第11~20记录,根据该文的思路,查询应该分两步走:
1)先用rownum语句从employee表中查询出第1~20条记录到中间结果temptable。SQL语句如下
select rownum rowno ,employee.* from employee where rownum<=20
2)再从中间结果temptable中查询出行号大于10的记录
所以最终的SQL语句是:
select * from
(select rownum rowno,employee.* from employee where rownum<=20) temptable
where temptable.rowno>10;
二、假如这个表中的数据量特别大,那么按照该方法步骤一查询的中间结果集将会很庞大,其实这一步
还可以进一步优化,使中间结果集temptable中只包含rowno和能唯一标识一条记录的字段(如employee表中
的ID字段),使中间结果集减到最小,然后从temptable中查询出符合要求的记录的ID,再根据ID从
employee表中查询出完整的记录。
优化的SQL语句为:
select * from employee where id in
(select temptable.id from
(select rownum rowno,employee.id from employee where rownum<=20) temptable)
where temptable.rowno>10
);