[英]Oracle sql query Order By gives different results
輸出
查詢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
為什么訂單在第二個查詢中更改? 請建議正確的解決方案,以限制第一個查詢結果的大小。
原因是ORDER BY無法保證重復值的排序 。
在您的查詢中,將DEVIATION_LEVEL
放在select的列列表中,然后您將了解當它們是重復值時,順序是不相同的。
例如,
查詢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。 如果您有相似的值,並且如果您訂購它們,就像隨機選擇它們一樣。
在不使用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;
子查詢中的ORDER BY
不保證結果; SELECT * FROM table ORDER BY 1;
與SELECT * FROM (SELECT * FROM table ORDER BY 1);
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.