HANA SQL参考及Oracle对照
By hujue
在本部分中,主要参考了《SAP_HANA数据库SQL参考手册》,以及《ORACLE sql参考手册》,针对我们日常使用的sql方式、内置函数、关键字,进行了对比
1.常用SQL写法
1.1.递归查询
SQL用法: 递归查询用于查询父子节点结构的数据表,形成树状结构的数据集,常用于菜单数据集、报表结构数据 | |
ORACLE | HANA |
select * from tf_rpt_hn_stat_bshzqk t where t.dept_id='10262200' start with t.dept_id='10000000' connect by prior t.dept_id=t.dept_mng_id order siblings by t.detp_id | select * from "tf_rpt_hn_stat_bshzqk" t where t.dept_id='10262200' start with t.dept_id='10000000' connect by prior t.dept_id=t.dept_mng_id order by t.detp_id |
对比说明: Oracle与hana的start with…connect by prior语句是一致的,条件语句也同样是先递归查询,后where筛选 除了以上,HANA中没有level、siblings关键字,无法像oracle有额外扩展功能 | |
1.2.竖转横查询
SQL用法: 竖转横查询用于将数据表中竖列的数据转换为横式进行显示 | |
ORACLE | HANA |
select t.issue, t.dept_id, t.obj_add_id, max(decode(t.zbdm,'FDCYXQK_0001',t.zbz,null)) A, max(decode(t.zbdm,'FDCYXQK_0002',t.zbz,null)) B, max(decode(t.zbdm,'FDCYXQK_0003',t.zbz,null)) C from tf_rpt_item_data_fdsc t oracle decimal类型group by t.issue,t.dept_id,t.obj_add_id | select t.issue, t.dept_id, t.obj_add_id, max(map(t.zbdm,'FDCYXQK_0001',t.zbz,null)) A, max(map(t.zbdm,'FDCYXQK_0002',t.zbz,null)) B, max(map(t.zbdm,'FDCYXQK_0003',t.zbz,null)) C from "tf_rpt_item_data_fdsc" t group by t.issue,t.dept_id,t.obj_add_id |
对比说明: 在HANA中,没有decode函数,与之功能相同的是map函数 | |
1.3.nullif
SQL用法: 一般用于设置被除数条件,当被除数为0时,设置结果为null | |
ORACLE | HANA |
select 100/nullif(0,0) from dual t | select 100/nullif(0,0) from DUMMY |
对比说明: 在ORACLE与HANA中,nullif功能相同,不同的是HANA没有dual表,只有DUMMY表 | |
1.4.nvl(oracle),ifnull(hana)
SQL用法: 当参数值为null时,返回指定的value | |
ORACLE | HANA |
select nvl(aaa,0) from tab t | select nvl(aaa,0) from tab t |
对比说明: hana中为ifnull;oracle中为nvl | |
1.5.delete
SQL用法: delete数据 | |
ORACLE | HANA |
delete from t1 a where exists (select 1 from t2 b where a.id = b.id ) | delete from t1 a where exists (select 1 from t2 b where a.id = b.id ) |
对比说明: HANA的DELETE语句与ORACLE类似,FROM子句只支持1个表(即需要从中删除记录的表)。 如果某个表需要删除的记录集合与其他表相关,那么需要在WHERE条件中实现关联。 | |
1.6.with子句
SQL用法: 用于定义虚拟表,方便多层嵌套语句的可读性 | |
ORACLE | HANA |
with bb as( select t.* from a t) select * from bb | with子句写法语法有误 替代写法 select * from (select * from "STS"."TF_RBAC_DEPARTMENT") bb |
对比说明: 在HANA中,不支持with子句功能 | |
1.7.update表
SQL用法: update数据表中的数据 | |
ORACLE | HANA |
update "STS"."TF_RBAC_DEPARTMENT" t set (addr,sort)=('11111',100) | update "STS"."TF_RBAC_DEPARTMENT" t set (addr,sort)=('11111',100) |
对比说明: update数据表语句一致 | |
1.8.多表关联update
SQL用法: update数据表中的数据 | |
ORACLE | HANA |
update TF_RPT_AJ_M_JZJCSJB t set (t.tcrq,t.zjycdxsj)=(select t1.tbbssj,t1.tjsj from TF_RPT_HN_STAT_BSHZQK t1 where t.issue=t1.issue and t.dept_id=t1.dept_id and t1.rpt_id='HAY01') where exists (select 1 from TF_RPT_HN_STAT_BSHZQK t1 where t.issue=t1.issue and t.dept_id=t1.dept_id and t1.rpt_id='HAY01' ) | update "TB"."TF_RPT_AJ_M_JZJCSJB" t set (t.tcrq,t.zjycdxsj)=(t1.tbbssj,t1.tjsj) from "TB"."TF_RPT_HN_STAT_BSHZQK" t1 where t.issue=t1.issue and t.dept_id=t1.dept_id and t1.rpt_id='HAY01' |
对比说明: 在hana中,如果某个表需要更新的记录集合与其他表相关,那么需要在FROM子句中指定相关的表,在WHERE子句中加入关联条件; 而对于oracle,多表关联update复杂一些,oracle不支持from子句,即不支持update from语法 | |
1.9.插入更新
SQL用法: 对于已经存在的记录进行更新,对于新的记录插入 | |
ORACLE | HANA |
merge into | UPSERT T(key,val) VALUES (1, 9) WHERE KEY = 1; UPSERT T(key,val) VALUES (1, 8) WITH PRIMARY KEY; |
对比说明: Oracle的merge into从9i就存在,可以对存在的记录进行更新,对于新的记录插入,避免proc中条件判断的低效率,相关信息可以自行baidu; Hana的upsert可以对存在的记录进行更新,对于新的记录插入,在列出的字段中,必须包含所有的主键字段,需要注意的是,upsert不是标准的sql语句,在各个数据库中不同 | |
1.10.多表关联插入更新
SQL用法: 关联其他数据表数据,对于已经存在的记录进行更新,对于新的记录插入 | |
ORACLE | HANA |
merge into | UPSERT "TB"."TF_RPT_AJ_M_JZJCSJB" (issue,dept_id,jz_id,tcrq,zjycdxsj) select t1.issue,t1.dept_id,t.jz_id,t1.tbbssj,t1.tjsj from "TB"."TF_RPT_HN_STAT_BSHZQK" t1,TF_RPT_AJ_M_JZJCSJB t where t.issue=t1.issue and t.dept_id=t1.dept_id and t1.rpt_id='HAY01' |
对比说明: Oracle的merge into从9i就存在,可以对存在的记录进行更新,对于新的记录插入,避免proc中条件判断的低效率,相关信息可以自行baidu; Hana的upsert可以对存在的记录进行更新,对于新的记录插入,在列出的字段中,必须包含所有的主键字段,多表关联时,比较类似insert语法 需要注意的是,upsert不是标准的sql语句,在各个数据库中不同 | |
1.11.like搜索
SQL用法: 用like进行模糊搜索 | |
ORACLE | HANA |
select * from "STS"."tf_rpt_hn_stat_bshzqk" t where t.dept_id like '100_' | select * from "STS"."tf_rpt_hn_stat_bshzqk" t where t.dept_id like '100_' |
对比说明: like数据表语句一致,可以用%或是_进行匹配 | |
1.12.case when
SQL用法: 在sql中使用if…then…else逻辑 | |
ORACLE | HANA |
select t.jzlb, case when t.jzlb='火电' then 'HD' when t.jzlb='水电' then 'SD' ELSE 'UNKOWN' END from tf_rpt_dept_jzxx t | select t.jzlb, case when t.jzlb='火电' then 'HD' when t.jzlb='水电' then 'SD' ELSE 'UNKOWN' END from "STS"."tf_rpt_dept_jzxx" t |
对比说明: case when使用同oracle一样, | |
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论