前两天去一家面试,问到分页sql怎么写的,当时回答两层select 语句 用rownum伪列
然后 让写一下
select * from (select rownum row,A.* from A) where row between ? and ? --这里 ? 我的想法是在java代码中传入起始条数与结束条数,起始条数就是当前页第一条在总的条数中第几条
当时项目经理笃定的告诉我,你这语句绝对执行不了,分页最少需要三层select
刚刚翻起之前写的分页语句
String sql = "SELECT * FROM (SELECT rownum roun,e.emp_id,e.emp_name,e.emp_email,e.emp_phone,e.emp_hiredate,j.job_name,e.emp_salary,d.dept_name " +"FROM emp e LEFT OUTER JOIN job j ON e.emp_job_id=j.job_id " +"LEFT OUTER JOIN dept d ON e.emp_dept_id=d.dept_id) " +"where roun between ? and ?";
刚刚在网上查找了一下可能是沟通的问题吧,这个语句确实能分页,但是应该不够严谨
SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A ) WHERE RN BETWEEN ? AND ?
在找到这段语句的同时 原文作者 又列出了这个
这段会比上面更有效率一些
<pre name="code" class="sql"><pre name="code" class="sql"><pre name="code" class="sql">SELECT * FROM ( SELECT A.*, ROWNUM RN FROM (SELECT * FROM TABLE_NAME) A--但是还是有些想不通 为什么不在这里直接写表名 非要写一层循环呢,这样不是需要多执行一段代码吗
<span> </span>--如果需要先排序 再分页的话这样写倒是能想通 但是 不需要排序 直接分页觉得这样会有些... WHERE ROWNUM <= 40--控制最大值
) WHERE RN >= 21--控制最小值