在编写sql时,经常会遇到根据查询出来的数据,进行逻辑处理然后再根据条件进行保存数据,当数据量小的时候或测试时,没有多大问题,但是,当数据量比较大时,达到百万级时,就会发现,这种写法是很浪费时间的,我之前遇到过一位同事开发的初始化系统的接口,需要初始化各种配置参数和系统参数,数据量比较大,结果接口跑了十几分钟才结束,这肯定是不能满足客户的要求了,在我协助下,最后接口在3秒内调用完的,就是采用了查询和新增合并的方式来实现的。
废话不多少说,直接上实例代码:
INSERT INTO SYSMN.SYS_MENU(
MENU_ID,HOSPITAL_ID,MENU_CODE,MENU_NAME,PARENT_MENU_ID,MODEL_ID,BASIC_MENU_FLAG,
MODEL_TYPE_FLAG,MENU_SORT,MENU_ICON,DISPLAY_FLAG,PY_CODE,WB_CODE,MENU_LEVEL,
SYS_TYPE,MENU_URL,MENU_STYLE,ACTION_TYPE,ROUTE_NAME,REPORT_ID)
SELECT
( SELECT max( a.MENU_ID ) FROM SYSMN.SYS_MENU a ) + rownum MENU_ID,
${hospitalId} HOSPITAL_ID,
a.MENU_CODE,
a.MENU_NAME,
0,
a.MODEL_ID,
a.BASIC_MENU_FLAG,
a.MODEL_TYPE_FLAG,
a.MENU_SORT,
a.MENU_ICON,
a.DISPLAY_FLAG,
a.PY_CODE,
a.WB_CODE,
a.MENU_LEVEL,
a.SYS_TYPE,
a.MENU_URL,
a.MENU_STYLE,
a.ACTION_TYPE,
a.ROUTE_NAME,
a.REPORT_ID
FROM
SYSMN.SYS_MENU a
WHERE
a.HOSPITAL_ID = 0
注意点:
(1)新增语句在上部,查询语句在下部,新增和查询语句中间不能用 ; 隔开,切记!。
(2)新增语句中只写到需要新增数据的字段即可。
(3)查询时的字段要和新增时的字段的值对应一致,即查询时的值就是一 一对应赋值给新增语句中的字段的。
(4)设计到主键时,如果数据库不支持主键自增,比如oracle,可考虑使用伪列序号协助添加主键。如果新增的某个字段为
默认值,则可在查询语句中对应该字段直接写死即可。
这种写法大致可理解为一种方法,这种方法也可将查询、更新语句进行合并,这里不再赘述,需要可留言。
#@Le.Hao#
帮助到您请点赞关注收藏谢谢!!