的输出
查询1:
select id from users
order by case when DEVIATION_LEVEL=2863 then 1 else 2 end
是
800019
800030
800040
800003
800007
800015
800025
800026....etc
输出 查询2:
select id from
(select id from users
order by case when DEVIATION_LEVEL=2863 then 1 else 2 end)
where rownum<=16;
是
800019
800030
800028
800020
800021
800018
800012
800161...etc
为什么第二个查询中的订单会发生变化?请建议正确的解决方案来限制第一个查询结果的大小。
答案 0 :(得分:2)
原因是 ORDER BY无法保证重复值的排序。
在您的查询中,将DEVIATION_LEVEL
放在选择的列列表中,然后您就会明白,当它们是重复值时,订单就不一样了。
例如,
查询1
SQL> SELECT empno, deptno FROM emp ORDER BY CASE WHEN deptno=10 THEN 1 ELSE 2 END;
EMPNO DEPTNO
---------- ----------
7782 10
7839 10
7934 10
7566 20
7654 30
7698 30
7900 30
7788 20
7369 20
7844 30
7876 20
7521 30
7499 30
7902 20
14 rows selected.
查询2
SQL> SELECT empno, deptno
2 FROM
3 (SELECT empno, deptno FROM emp ORDER BY CASE WHEN deptno=10 THEN 1 ELSE 2 END
4 )
5 WHERE rownum<=5;
EMPNO DEPTNO
---------- ----------
7782 10
7934 10
7839 10
7369 20
7654 30
SQL>
因此,在应用ROWNUM的第二种情况下的排序,它是在相似值中随机选取的。
查看前三个有序行:
输出1
EMPNO DEPTNO
---------- ----------
7782 10
7839 10
7934 10
输出2
EMPNO DEPTNO
---------- ----------
7782 10
7934 10
7839 10
ORDER BY deptno不会保证每次都有相同的订单。在上面的查询中,如果你想要一个特定的订单,那么也可以在另一列上进行ORDER BY,即empno。
ORDER BY empno, deptno
如果比较两个输出,则不能保证排序总是相同,因为deptno与所有三行中的10相同。如果您有相似的值,并且如果您订购它们,就像随机选择它们一样。
答案 1 :(得分:1)
执行不带ORDER BY子句的SELECT查询时,结果的顺序未确定。如果您想要或需要具有一致的排序行为,请使用顶级SELECT的ORDER BY子句。
当您使用ROWNUM字段限制行时,oracle中存在异常。在这种情况下,ROWNUM过滤器会在应用order by子句之前减少结果集,从而删除应该首先出现的行。
select id from users
order by case when DEVIATION_LEVEL=2863 then 1 else 2, id;
和
select id from
(select id from users
order by case when DEVIATION_LEVEL=2863 then 1 else 2 end, id)
where rownum<=16;
答案 2 :(得分:0)
ORDER BY
不保证结果; SELECT * FROM table ORDER BY 1;
与SELECT * FROM (SELECT * FROM table ORDER BY 1);