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小时内删除。