首页 文章

通过SELECT语句使用附加数据填充内部表的其他列?可以这样做吗?

提问于
浏览
2
SELECT matnr ersda ernam laeda 
FROM mara 
INTO CORRESPONDING FIELDS OF TABLE gt_mara 
UP TO 100 ROWS.

此时我在itab gt_mara 中有100个条目 .

SELECT aenam vpsta pstat lvorm mtart
  FROM mara
  INTO CORRESPONDING FIELDS OF TABLE gt_mara
  FOR ALL ENTRIES IN gt_mara
  WHERE matnr = gt_mara-matnr AND
        ersda = gt_mara-ersda AND
        ernam = gt_mara-ernam AND
        laeda = gt_mara-laeda.

此时我有59个条目 . 这是有道理的 . 此代码有问题,因为它可能在运行时修改选择条件 .

无论如何我的意图是:在一个点上选择表格的前4个字段,然后在其他点选择其他5个字段 .

当然,这只是一个例子 . 也许第二次选择将在具有相同键或具有不同数量的字段的不同表上完成 .

这甚至可以做到吗?是否有更有效的方法来实现这一点,而不是我默认的想法(重做完整选择)?

2 回答

  • 1

    SELECT 你需要的所有东西(如果数据来自同一个表,这是首选的解决方案)或 SELECT 以后的其他东西(如果这些东西来自不用于第一次选择的不同表,这是一个好主意) . 对于组装结果集,数据库通常需要反正访问整个数据集,所以它并没有真正伤害到选择一些附加字段 - 对比再次命中数据库有大量 SELECT 声明(如果 FOR ALL ENTRIES 表变大) . 还要记住 - 根据您正在进行的处理类型 - 表格的内容可能在此期间发生了变化 . 如果数据库事务(LUW)结束(对话步骤之间总是这种情况),则会丢失数据库级事务隔离 .

  • 2

    好吧我认为你的问题的实质更多的是你是否可以通过第二个select语句直接更新内部表中的某些未填充字段 .

    答案是不 . 您的第二个select语句将替换表 gt_mara 中的内容,因此您将留下一个内部表,其中前4个字段为空,最后5个字段为空 .

    你能做的最好的是这样的:

    SELECT matnr ersda ernam laeda 
      FROM mara 
      INTO CORRESPONDING FIELDS OF TABLE gt_mara 
      UP TO 100 ROWS.
    
    
    SELECT matnr aenam vpsta pstat lvorm mtart
      FROM mara
      INTO CORRESPONDING FIELDS OF TABLE gt_mara2
      FOR ALL ENTRIES IN gt_mara
      WHERE matnr = gt_mara-matnr AND
            ersda = gt_mara-ersda AND
            ernam = gt_mara-ernam AND
            laeda = gt_mara-laeda.
    
    loop at gt_mara2 into ls_mara.
      modify gt_mara from ls_mara transporting aenam vpsta pstat lvorm mtart 
        where matnr = ls_mara-matnr.
    endloop.
    

    这显然是非常低效的,这就是为什么在将数据带回应用服务器之前,总是会尝试让数据库为您完成尽可能多的工作 . 显然,如果数据来自同一个表,那么一次性选择它将是您的最佳选择 . 在大多数情况下,即使数据位于不同的表中,您最好还是创建视图或使用连接 .

    在极少数情况下,有必要在内部表格中循环以填写原始选择时无法使用的某些字段 .

相关问题