关于Oracle的语句执行顺序

来源:互联网 发布:牧在线网络汉语汉字典 编辑:程序博客网 时间:2024/06/18 09:37
今天小菜鸟敲代码碰到很有意思的事情,代码如下:
select sum(a),case when t.item.id IN(03,04)THEN '08'ELSE t.item_id ENDfrom tab twhere 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_codefrom (select t.*,case when t.item.id IN(03,04)THEN '08'ELSE t.item_id END item_codefrom tab where t.item_id IN(03,04)and      t.as_of_date=date'2017-02-28'and      t.ISO_CURRENCY_CD='ZHRMB')t1group by item_code
原因是oracle在执行这条语句的时候,先执行了from后面的子查询,然后把返回的结果集插入到查询中。一般来说Oracle执行sql语句,有如下优先顺序:1、from子查询 2、where子句 3、group by分组 4、having进行筛选 5、表达式计算 6、返回来执行select查询 7、将查询结果用order by排序
点击打开传送门(出此原文)


 
原创粉丝点击