问题描述
最近回头看以前的数据库教材《数据库系统概论》人大 王珊 版的有一段叙述:“需要特别指出的是,子查询的select语句不能使用 order by子句,order by子句只能对最终查询结果排序”但是正好之前练习碰到个场景,就在子句中用了order by ,结果也是正确的。所以我很疑惑,是书上说错了还是什么原因下面是SQLselect userid from (select userid,min(createtime) from LT_BIZORDER t where (t.status in (1,2,3,4,5) or (t.status=6 and t.endstatus in (0,1,2))) and createtime > to_date('2014-06-01','yyyy/MM/dd') group by t.userid order by min(createtime) asc) where rownum<=10000
解决方案
1.子查询是可以使用order by2.我测试了 select * from (子查询 order by) select * from table A where id not in (子查询 order by )都是可以的3、下面截取官档一段order by 和 rownum 一起用的范例!If you embed the ORDER BY clause in a subquery and place the ROWNUM condition in the top-level query, then you can force the ROWNUM condition to be applied after the ordering of the rows. For example, the following query returns the employees with the 10 smallest employee numbers. This is sometimes referred to as top-N reporting:SELECT * FROM (SELECT * FROM employees ORDER BY employee_id) WHERE ROWNUM < 11;
解决方案二:
当order by 与 rownum一起使用时,当然有意义,因为子查询的结果会影响到最终的返回结果集,并且在这种情况下,order by必须写在子查询里。但是就其他的情况而论,在子查询里写order by 没有实际意义,反而影响查询效率。你可以尝试执行一个子查询中带有Order by,且没有rownum的sql。执行后查看执行计划,你会发现执行计划里根本没有对子查询做order by操作,因为它也觉得这么做没有必要。
解决方案三:
可以用,只是最终结果不一样
解决方案四:
书上写错了。SELECT <expression list> [TOP <n>] FROM <model> [WHERE <condition list>] [ORDER BY <expression> [DESC|ASC]]里面[]表示根据实际需要可写可不写。最后说一句,书中不可能是都正确,随着对错误的纠正,也就了解的多了。
解决方案五:
当然影响啊,你from的张间接查询出来的表,由于该间接表已排好序,产生的结果当然受”间接表影响
解决方案六:
子查询是可以用order by的,并且这个orderby 会影响主查询的结果顺序。书上写错了。