作为abaper ,open sql中的select和in 子查询属于日常必备的技能。然而,open sql还有一些语法你可能没用过甚至没听过,这些语法用好了可以大大减少代码复杂度和提高性能,下面就来看看这些用法吧。
场景1
取创建日期晚于凭证日期的采购凭证,用于统计补单率。
代码1
select eneln bedat aedat into table lt_ekko from ekko where...
loop at lt_ekko into ls_ekko.
check ls_ekko-bedat >= ls_ekko-aedat. "检查凭证日期是否大于等于创建日期
write:/ ls_ekko.
endloop.
代码2
select eneln bedat aedat into table lt_ekko from ekko as a
where a~bedat >= a~aedat.
对比两段代码,第一段将所有订单数据加载到内表中在做二次对比,
第二段代码在数据库层面就已经将数据筛选完成,无论是代码复杂度还是处理时间都是第二段较好.
场景2
取物料凭证中没有冲销的凭证.
代码1
select mblnr zeile gjahr sjahr smbln smblp into lt_mseg from mseg where ...
loop at lt_mseg into ls_mseg.
if ls_mseg-smbln is not initial. "如果有被冲销凭证,则将改凭证标识为已冲销.
ls_mseg01-is_cancled = abap_true.
modify lt_mseg from ls_mseg01 transporting is_cancled where gjahr = ls_mseg-sjahr mblnr = ls_mseg-smbln zeile = ls_mseg-smblp.
endif.
endloop.
*删除所有标识为已冲销或被冲销凭证不为空的记录
delete lt_mseg where is_cancled = abap_true or smbln is not initial.
代码2
select mblnr zeile gjahr sjahr smbln smblp into lt_mseg from mseg as a
where not exist ( select * from mseg as b on a~gjahr = b~sjahr and a~mblnr = b~smbln a~zeile = b~smblp )...
对比两段代码,第一段将所有凭证加载到内表进行比较后排除冲销凭证,第二段则通过exist
关键字从数据库层面排除了冲销凭证.明显第二段处理逻辑代码量和处理逻辑都较为简单.
第二段代码由于子查询中未用到主键和索引,因此从性能来说比第一段要差,但这里只是展示exist
关键字的用法,因此对时间不做过多考虑