簡體   English   中英

Oracle sql查詢Order By給出了不同的結果

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM