1. 程式人生 > >關於Oracle的語句執行順序

關於Oracle的語句執行順序

今天小菜鳥敲程式碼碰到很有意思的事情,程式碼如下:
select sum(a),case when t.item.id IN(03,04)THEN '08'ELSE t.item_id END
from tab t
where t.item_id IN(03,04)and
      t.as_of_date=date'2017-02-28'and
      t.ISO_CURRENCY_CD='ZHRMB'
group by item_id
結果當然是出現了兩條資料,欄位a並沒有被sum,下面是正確的程式碼
select sum(a),item_code
from (
select t.*,case when t.item.id IN(03,04)THEN '08'ELSE t.item_id END item_code
from tab 
where t.item_id IN(03,04)and
      t.as_of_date=date'2017-02-28'and
      t.ISO_CURRENCY_CD='ZHRMB')t1
group by item_code
原因是oracle在執行這條語句的時候,先執行了from後面的子查詢,然後把返回的結果集插入到查詢中。一般來說Oracle執行sql語句,有如下優先順序:1、from子查詢 2、where子句 3、group by分組 4、having進行篩選 5、表示式計算 6、返回來執行select查詢 7、將查詢結果用order by排序