如何在ABAP CDS中实现EXISTS功能?
替代ABAP CDS中EXISTS的解决方案
要实现原OpenSQL里“获取所有含物料编号ABCD的销售订单”的逻辑,因为CDS不支持EXISTS语法,可通过以下几种实用方式规避:
方案1:内连接+DISTINCT去重
利用内连接关联销售订单抬头(VBAK)和行项目(VBAP),筛选物料为ABCD的行后,用DISTINCT确保每个订单只返回一次,和原EXISTS逻辑完全等价。
CDS代码示例:
@EndUserText.label: '含物料ABCD的销售订单' define view ZCDS_SALES_ORDERS_ABCD as select distinct from vbak inner join vbap on vbak.vbeln = vbap.vbeln where vbap.matnr = 'ABCD' { vbak.vbeln, vbak.erdat, vbak.auart, // 按需添加其他VBAK字段 }
方案2:CDS关联+非空判断
这是CDS推荐的写法,通过定义关联(Association)限定物料条件,再用关联对象非空来判断存在性,性能更优。
CDS代码示例:
@EndUserText.label: '含物料ABCD的销售订单' define view ZCDS_SALES_ORDERS_ABCD as select from vbak association [0..1] to vbap as _AbcdItem on _AbcdItem.vbeln = vbak.vbeln and _AbcdItem.matnr = 'ABCD' { vbak.vbeln, vbak.erdat, vbak.auart, // 按需添加其他VBAK字段 _AbcdItem // 不需要行项目信息可省略 } where _AbcdItem is not null;
方案3:IN子查询筛选
如果是只需要订单号的简单场景,也可以用IN子查询获取符合条件的订单集合,再匹配VBAK数据,不过数据量大时性能不如前两种方案。
CDS代码示例:
@EndUserText.label: '含物料ABCD的销售订单' define view ZCDS_SALES_ORDERS_ABCD as select from vbak where vbak.vbeln in ( select vbap.vbeln from vbap where vbap.matnr = 'ABCD' ) { vbak.vbeln, vbak.erdat, vbak.auart, // 按需添加其他VBAK字段 }
内容的提问来源于stack exchange,提问作者András
相关产品推荐
相关产品推荐

