Select 是否在ON子句中使用子字符串进行选择?

Select 是否在ON子句中使用子字符串进行选择?,select,substring,abap,opensql,Select,Substring,Abap,Opensql,我在ABAP中有以下select语句: SELECT munic~mandt VREFER BIS AB ZZELECDATE ZZCERTDATE CONSYEAR ZDIMO ZZONE_M ZZONE_T USAGE_M USAGE_T M2MC M2MT M2RET EXEMPTMCMT EXEMPRET CHARGEMCMT INTO corresponding fields of table GT_INSTMUNIC_F FROM ZCI00_INSTMUNIC AS MUNIC I

我在ABAP中有以下select语句:

SELECT munic~mandt VREFER BIS AB ZZELECDATE ZZCERTDATE CONSYEAR ZDIMO ZZONE_M ZZONE_T USAGE_M USAGE_T M2MC M2MT M2RET EXEMPTMCMT EXEMPRET CHARGEMCMT
INTO corresponding fields of table GT_INSTMUNIC_F
FROM ZCI00_INSTMUNIC AS MUNIC
INNER JOIN EVER AS EV on
  MUNIC~POD = EV~VREFER(9).
"where EV~BSTATUS = '14' or EV~BSTATUS = '32'.
我对上述语句的问题是不能识别'on'子句上的子字符串/偏移操作。如果我移除“(9),则 它可以识别字段,否则会给出错误:

字段ev~参考未知。它既不在指定的表中,也不在指定的表中 也不是由“数据”语句定义的。我还尝试过在“Where”子句中执行类似的操作,收到了类似的错误:

LOOP AT gt_instmunic.

 clear wa_gt_instmunic_f.

 wa_gt_instmunic_f-mandt = gt_instmunic-mandt.
 wa_gt_instmunic_f-bis = gt_instmunic-bis.
 wa_gt_instmunic_f-ab = gt_instmunic-ab.
 wa_gt_instmunic_f-zzelecdate = gt_instmunic-zzelecdate.
 wa_gt_instmunic_f-ZZCERTDATE = gt_instmunic-ZZCERTDATE.
 wa_gt_instmunic_f-CONSYEAR = gt_instmunic-CONSYEAR.
 wa_gt_instmunic_f-ZDIMO = gt_instmunic-ZDIMO.
 wa_gt_instmunic_f-ZZONE_M = gt_instmunic-ZZONE_M.
 wa_gt_instmunic_f-ZZONE_T = gt_instmunic-ZZONE_T.
 wa_gt_instmunic_f-USAGE_M = gt_instmunic-USAGE_M.
 wa_gt_instmunic_f-USAGE_T = gt_instmunic-USAGE_T.

 temp_pod = gt_instmunic-pod.

  SELECT vrefer
  FROM ever
    INTO wa_gt_instmunic_f-vrefer
    WHERE ( vrefer(9) LIKE temp_pod  ).            " PROBLEM WITH SUBSTRING
    "AND ( BSTATUS = '14' OR BSTATUS = '32' ).
  ENDSELECT.

  WRITE: / sy-dbcnt.
  WRITE: / 'wa is: ', wa_gt_instmunic_f.
  WRITE: / 'wa-ever is: ', wa_gt_instmunic_f-vrefer.
  APPEND wa_gt_instmunic_f TO gt_instmunic_f.
  WRITE: / wa_gt_instmunic_f-vrefer.
ENDLOOP.

itab_size = lines( gt_instmunic_f ).
WRITE: / 'Internal table populated with', itab_size, ' lines'.
我想实现的基本任务是修改一个表上的特定字段, 从另一个获取值。它们有一个公共字段(pod=vrefer(9))。提前感谢您抽出时间

它们有一个公共字段(pod=vrefer(9))

这是一个错误的假设,因为它们都不是字段,而是一个字段和另一个事物


如果你真的需要通过SQL完成这项任务,我建议你检查本机SQL语句,如子字符串,并检查你是否能够在EXEC_SQL或(更好的)CL_SQL*类中使用它们。

字段(9)
是一个由ABAP环境处理的子集操作,无法转换为数据库级SQL语句(至少目前没有,但如果可能的话,我会感到惊讶)。您最好的选择是分别选择数据集并手动合并它们(如果两个数据集的大小大致相同),或者预先选择一个数据集并使用FAE/IN子句。

如果您使用的是足够晚的NetWeaver版本,它在7.51上运行,您可以使用OpenSQL函数
LEFT
子字符串
。您的查询类似于:

SELECT munic~mandt VREFER BIS AB ZZELECDATE ZZCERTDATE CONSYEAR ZDIMO ZZONE_M ZZONE_T USAGE_M USAGE_T M2MC M2MT M2RET EXEMPTMCMT EXEMPRET CHARGEMCMT
  FROM ZCI00_INSTMUNIC AS MUNIC
  INNER JOIN ever AS ev 
          ON MUNIC~POD EQ LEFT( EV~VREFER, 9 )
  INTO corresponding fields of table GT_INSTMUNIC_F.

请注意,
INTO
子句也需要移到命令的末尾

不要将本机SQL用于应用程序级编程。如果我能找到另一种方法,我会尽量避免,但OP已经询问了一个SQL选项。顺便说一句,你可以向我们解释为什么永远不使用本机SQL。。。这将有助于我们提高知识水平,也会让你的评论显得不那么粗鲁。我编辑答案是为了让你少一点暴躁;)回答我自己:OP没有要求SQL方法:我的错。对于“脾气暴躁”的评论,我深表歉意,我将离开这里,因为我感到羞愧(尽管为了解释您的“曾经”仍然是件好事)ABAP使用OpenSQL将SELECT语句转换为db SPECT查询。通过使用本机SQL,您假设无论连接到应用程序服务器的数据库是什么,您的代码都可以工作,这是一个非常危险的假设。做出这样的假设真的有那么危险吗?除非您正在构建栓接代码,否则我从未在一家更改DB平台的公司工作过。即使在今天,你听到的最主要的是AnyDB to HANA。有很多工具可以告诉您在HANA转换之前需要更改哪些内容。这是最佳实践吗?不,但我认为“非常危险”和“永远不要使用”有点过头了。vwegert建议(手动合并两个表)听起来比任何SQL肮脏伎俩都好。此外,你确定你的需求或你的方法吗?我担心使用部分字段链接数据是危险的。。。如果你有两份相同初始职位的合同呢?你打算如何决定哪一个是正确的?