HANA SQL参考及Oracle对照

这篇博客对比了SAP HANA和Oracle数据库在SQL语法、内置函数和关键字方面的异同,包括常用SQL写法如递归查询、更新、删除、多表关联等,以及日期时间类型、数字类型、字符类型和大对象类型的对比,并详细列举了各种数据转换和日期时间函数,还有字符串函数和一些杂项函数的使用示例。
摘要由CSDN通过智能技术生成

HANA SQL参考及Oracle对照

 

在本部分中,主要参考了《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有额外扩展功能

 

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

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.2. 竖转横查询

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值