`
moonfly2004
  • 浏览: 56437 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
社区版块
存档分类
最新评论

两内表关联删除操作

阅读更多

有两个内部表:IT_TAB1(假设N条记录),I T_TAB2(假设M条记录)。
I T_TAB1的结构如下
ID  BUKRS  BELNR  DMBTR
001 A001  1000000010 10000
002 A001  1000000020 20000
…… …… …… ……
I T_TAB2的结构如下
BUKRS  BELNR
A001  1000000010
A001  1000000050
…… ……
要求是根据内部表ITAB2对内部表ITAB1进行删除处理,ITAB1中BELNR项与ITAB2中BELNR项相同的全部删除掉,该事例中所得结果应为:
I T_TAB1的结构如下
ID  BUKRS  BELNR  DMBTR
002 A001  1000000020 20000
…… …… …… ……

方法一:循环套循环
外层循环IT_TAB2,里层循环IT_TAB1。
此种方法被一般ABAP开发规约所禁止。
三种方法中,执行时间排第二。

方法二:利用RANGE TABLE
将IT_TAB2导入RANGE TABLE,
在条件中使用IN语句来删除IT_TAB1.
此种方法,由于RANGE TABLE的做成使用了一回循环,
再加上用IN 语句删除,相当于使用了两次循环,所以速度比较慢,
三种方法中,执行时间排第三。
另外此法只适用于比较项目(例如IT_TAB2-BELNR)只有一项时,
而且,作为比较项目的该项值被反复使用时(假设还有内部表IT_TAB3,IT_TAB4…都需要根据IT_TAB2中的BELNR项来作相应处理时),
采用该法,才更显效率。
如果比较项目为复数项时,请使用其他两种方法。

方法三:并行算法
使用该算法,要事先对两个内部表进行排序,
然后两层循环嵌套,
外层是IT_TAB2,里层是IT_TAB1。
与方法一不同的是,
方法一的执行次数为(N * M),方法三的执行次数为( N + M )。
所以该方法在三种方法中,执行时间排第一。
但使用该算法有一个条件限制,
就是IT_TAB1中的记录一定要在IT_TAB2所包含的记录范围内。
嵌套循环时推荐尽可能使用该平行算法。
该法缺点是:1.使用限制条件要判断准确。
                        2.代码可读性差。

 
*&---------------------------------------------------------------------*
*& 作成者   : KONGXIANGSHUAI
*& 作成日   : 2006/03/20
*& 機能概要   :
*&     内部テーブルIT_TAB2により、内部テーブルIT_TAB1から
*&     同じのレコードを削除する例。
*&---------------------------------------------------------------------*
REPORT ZZTEST4 NO STANDARD PAGE HEADING.

*----------------------------------------------------------------------*
*    構造宣言
*----------------------------------------------------------------------*
* 内部テーブル1
TYPES: BEGIN OF T_TAB1,
         ID    TYPE I,             "番号
         BUKRS TYPE BSID-BUKRS,    "会社コード
         BELNR TYPE BSID-BELNR,    "会計伝票番号
         DMBTR TYPE BSID-DMBTR,    "国内通貨額
       END OF T_TAB1.

* 内部テーブル2
TYPES: BEGIN OF T_TAB2,
         BUKRS TYPE BSID-BUKRS,    "会社コード
         BELNR TYPE BSID-BELNR,    "会計伝票番号
       END OF T_TAB2.

*----------------------------------------------------------------------*
*    内部テーブルと項目列宣言
*----------------------------------------------------------------------*
* 内部テーブル1
DATA : IT_TAB1 TYPE STANDARD TABLE OF T_TAB1 INITIAL SIZE 0,
       WA_TAB1 TYPE T_TAB1.

* 内部テーブル2
DATA : IT_TAB2 TYPE STANDARD TABLE OF T_TAB2 INITIAL SIZE 0,
       WA_TAB2 TYPE T_TAB2.

* 方法1用
DATA : IT_TAB11 TYPE STANDARD TABLE OF T_TAB1 INITIAL SIZE 0,
       WA_TAB11 TYPE T_TAB1.

* 方法2用
DATA : IT_TAB12 TYPE STANDARD TABLE OF T_TAB1 INITIAL SIZE 0,
       WA_TAB12 TYPE T_TAB1.

* 方法3用
DATA : IT_TAB13 TYPE STANDARD TABLE OF T_TAB1 INITIAL SIZE 0,
       WA_TAB13 TYPE T_TAB1.

* RANGES TABLE
RANGES IT_BELNR FOR BSID-BELNR.
DATA WA_BELNR LIKE IT_BELNR.

*----------------------------------------------------------------------*
*    変数宣言
*----------------------------------------------------------------------*
DATA :
  V_T1    TYPE I,     "RUNTIME1
  V_T2    TYPE I,     "RUNTIME2
  V_TIME1 TYPE I,     "方法1RUNTIME
  V_TIME2 TYPE I,     "方法2RUNTIME
  V_TIME3 TYPE I.     "方法3RUNTIME

*----------------------------------------------------------------------*
*    START-OF-SELECTION
*----------------------------------------------------------------------*
START-OF-SELECTION.

* テストデータの設定
  PERFORM FRM_SET_DATA.

* テスト処理
  PERFORM FRM_EDIT_DATA.

* 結果の出力
  PERFORM FRM_OUTPUT_DATA.

*&---------------------------------------------------------------------*
*&      Form  FRM_SET_DATA
*&---------------------------------------------------------------------*
*       テストデータの設定
*----------------------------------------------------------------------*
*       -->  なし
*       <--  なし
*----------------------------------------------------------------------*
FORM FRM_SET_DATA.

* 内部テーブル1のデータの設定
  CLEAR WA_TAB1.
  WA_TAB1-ID = 1.
  WA_TAB1-BUKRS = 'A001'.
  WA_TAB1-BELNR = '1000000010'.
  WA_TAB1-DMBTR = 10000.
  APPEND WA_TAB1 TO IT_TAB1.

  CLEAR WA_TAB1.
  WA_TAB1-ID = 2.
  WA_TAB1-BUKRS = 'A001'.
  WA_TAB1-BELNR = '1000000020'.
  WA_TAB1-DMBTR = 20000.
  APPEND WA_TAB1 TO IT_TAB1.

  CLEAR WA_TAB1.
  WA_TAB1-ID = 3.
  WA_TAB1-BUKRS = 'A001'.
  WA_TAB1-BELNR = '1000000030'.
  WA_TAB1-DMBTR = 30000.
  APPEND WA_TAB1 TO IT_TAB1.

  CLEAR WA_TAB1.
  WA_TAB1-ID = 4.
  WA_TAB1-BUKRS = 'A001'.
  WA_TAB1-BELNR = '1000000040'.
  WA_TAB1-DMBTR = 40000.
  APPEND WA_TAB1 TO IT_TAB1.

  CLEAR WA_TAB1.
  WA_TAB1-ID = 5.
  WA_TAB1-BUKRS = 'A001'.
  WA_TAB1-BELNR = '1000000050'.
  WA_TAB1-DMBTR = 10000.
  APPEND WA_TAB1 TO IT_TAB1.

  CLEAR WA_TAB1.
  WA_TAB1-ID = 6.
  WA_TAB1-BUKRS = 'A001'.
  WA_TAB1-BELNR = '1000000060'.
  WA_TAB1-DMBTR = 20000.
  APPEND WA_TAB1 TO IT_TAB1.

  CLEAR WA_TAB1.
  WA_TAB1-ID = 7.
  WA_TAB1-BUKRS = 'A001'.
  WA_TAB1-BELNR = '1000000070'.
  WA_TAB1-DMBTR = 30000.
  APPEND WA_TAB1 TO IT_TAB1.

  CLEAR WA_TAB1.
  WA_TAB1-ID = 8.
  WA_TAB1-BUKRS = 'A001'.
  WA_TAB1-BELNR = '1000000080'.
  WA_TAB1-DMBTR = 40000.
  APPEND WA_TAB1 TO IT_TAB1.

* 内部テーブル2のデータの設定
  CLEAR WA_TAB2.
  WA_TAB2-BUKRS = 'A001'.
  WA_TAB2-BELNR = '1000000010'.
  APPEND WA_TAB2 TO IT_TAB2.

  CLEAR WA_TAB2.
  WA_TAB2-BUKRS = 'A001'.
  WA_TAB2-BELNR = '1000000030'.
  APPEND WA_TAB2 TO IT_TAB2.

ENDFORM.                    "FRM_SET_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_EDIT_DATA
*&---------------------------------------------------------------------*
*          テスト処理
*----------------------------------------------------------------------*
*       -->  なし
*       <--  なし
*----------------------------------------------------------------------*
FORM FRM_EDIT_DATA.

  SORT IT_TAB1 ASCENDING BY BELNR.
  SORT IT_TAB2 ASCENDING BY BELNR.

* 方法1
  IT_TAB11 = IT_TAB1.
  GET RUN TIME FIELD V_T1.            "実行時間比較用
  SORT IT_TAB11 ASCENDING BY BELNR.
  LOOP AT IT_TAB2 INTO WA_TAB2.
    LOOP AT IT_TAB11 INTO WA_TAB11 WHERE BELNR = WA_TAB2-BELNR.
      DELETE TABLE IT_TAB11 FROM WA_TAB11.
    ENDLOOP.
  ENDLOOP.
  GET RUN TIME FIELD V_T2.            "実行時間比較用
  V_TIME1 = V_T2 - V_T1.              "実行時間

* 方法2
  IT_TAB12 = IT_TAB1.
  GET RUN TIME FIELD V_T1.            "実行時間比較用
  SORT IT_TAB12 ASCENDING BY BELNR.
  LOOP AT IT_TAB2 INTO WA_TAB2.
    WA_BELNR-LOW    = WA_TAB2-BELNR.
    WA_BELNR-SIGN   = 'I'.
    WA_BELNR-OPTION = 'EQ'.
    APPEND WA_BELNR TO IT_BELNR.
  ENDLOOP.
  DELETE IT_TAB12 WHERE BELNR IN IT_BELNR.
  GET RUN TIME FIELD V_T2.            "実行時間比較用
  V_TIME2 = V_T2 - V_T1.              "実行時間

* 方法3
  IT_TAB13 = IT_TAB1.
  SORT IT_TAB13 ASCENDING BY BELNR.
  GET RUN TIME FIELD V_T1.            "実行時間比較用
  DATA V_I TYPE I.
  V_I = 1.
  LOOP AT IT_TAB2 INTO WA_TAB2.
    LOOP AT IT_TAB13 INTO WA_TAB13 FROM V_I.
      IF WA_TAB13-BELNR = WA_TAB2-BELNR.
        DELETE TABLE IT_TAB13 FROM WA_TAB13.
        V_I = V_I + 1.
      ELSE.
        EXIT.
      ENDIF.
    ENDLOOP.
  ENDLOOP.
  GET RUN TIME FIELD V_T2.            "実行時間比較用
  V_TIME3 = V_T2 - V_T1.              "実行時間

ENDFORM.                    "FRM_EDIT_DATA

*&---------------------------------------------------------------------*
*&      Form  FRM_OUTPUT_DATA
*&---------------------------------------------------------------------*
*           結果の出力
*----------------------------------------------------------------------*
*       -->  なし
*       <--  なし
*----------------------------------------------------------------------*
FORM FRM_OUTPUT_DATA.

  WRITE '内部テーブル1'.
  LOOP AT IT_TAB1 INTO WA_TAB1.
    WRITE : / WA_TAB1-ID,
              WA_TAB1-BUKRS,
              WA_TAB1-BELNR,
              WA_TAB1-DMBTR.
  ENDLOOP.
  ULINE.
  WRITE '内部テーブル2'.
  LOOP AT IT_TAB2 INTO WA_TAB2.
    WRITE : / WA_TAB2-BUKRS,
              WA_TAB2-BELNR.
  ENDLOOP.
  ULINE.
  WRITE : '方法1の結果',
          'RUNTIME:',
          V_TIME1.

  LOOP AT IT_TAB11 INTO WA_TAB11.
    WRITE : / WA_TAB11-ID,
              WA_TAB11-BUKRS,
              WA_TAB11-BELNR,
              WA_TAB11-DMBTR.
  ENDLOOP.
  ULINE.
  WRITE : '方法2の結果',
          'RUNTIME:',
          V_TIME2.

  LOOP AT IT_TAB12 INTO WA_TAB12.
    WRITE : / WA_TAB12-ID,
              WA_TAB12-BUKRS,
              WA_TAB12-BELNR,
              WA_TAB12-DMBTR.
  ENDLOOP.
  ULINE.
  WRITE : '方法3の結果',
          'RUNTIME:',
          V_TIME3.

  LOOP AT IT_TAB13 INTO WA_TAB13.
    WRITE : / WA_TAB13-ID,
              WA_TAB13-BUKRS,
              WA_TAB13-BELNR,
              WA_TAB13-DMBTR.
  ENDLOOP.

ENDFORM.                    "FRM_OUTPUT_DATA
分享到:
评论

相关推荐

    Oracle中多表关联批量插入批量更新与批量删除操作

    在Oracle数据库中,进行多表关联的批量插入、批量更新和批量删除操作是常见的数据库管理任务,尤其是在处理大量数据时,这些操作能显著提高效率并减少资源消耗。本文将详细探讨这三个方面,并通过实例代码来展示如何...

    C#编程 数据库操作应用 使用触发器删除相关联的两表间的数据(源码)(源码)

    C#编程 数据库操作应用 使用触发器删除相关联的两表间的数据(源码)(源码)C#编程 数据库操作应用 使用触发器删除相关联的两表间的数据(源码)(源码)C#编程 数据库操作应用 使用触发器删除相关联的两表间的数据(源码)...

    主从表关联问题

    一、使用视图meeting将多表关联整合在一起 二、通过Sql语句筛选数据 三、建立和主从表的关联 四、注意在CrystalReport1表中插入子报表的时候,一定要将主从表的关联字段设置好,否则出乱子

    如何实现多数据表关联呢?Delphi的方法实例..rar

    2. **TTable组件**:TTable是用于直接操作单一数据库表的组件,它允许我们打开、关闭、编辑、添加和删除表中的记录。在实现多表关联时,通常会用到TTable组件来代表每个相关的数据库表。 3. **关联字段(Foreign ...

    数据开发基础知识点-2(多表关联).docx

    在多表关联设计中,处理数据更新、删除等操作时有两种常见的方法: 1. **手动编写SQL语句:** - **优点:**可以根据具体需求定制SQL语句,灵活性高。 - **缺点:**编写复杂,容易出错;特别是对于大规模数据处理...

    数据开发基础知识点-2(多表关联)

    本篇文章主要探讨了单表存储与多表关联两种设计模式及其在数据存取上的优缺点。 首先,单表存储是一种将相关数据集成在一个表内的设计方式,例如在表A中有一个字段CustNo,它存放了从基础表B中选取的资料。这种设计...

    MSserver自关联表的级联删除

    1. 定义两个临时表`@idtable`和`@lastidtable`,分别用来存储待删除的记录ID和上一轮删除的记录ID。 2. 将即将被删除的记录ID存入`@lastidtable`。 3. 当`@lastidtable`中有ID时,进入循环: - 通过查询找到所有...

    mysql delete 多表连接删除功能

    对于单个表的删除操作,有以下几种形式: 1. **按条件删除特定行**: ```sql DELETE FROM tableName WHERE columnName = value; ``` 这将删除满足指定条件的所有行。 2. **删除表内所有行**: ```sql DELETE...

    openstack删除数据库中instance关联表内容的方法

    如果直接尝试删除“instances”表中的某一行记录,而该记录在其他表中有引用,则会触发数据库级别的完整性检查,并因此导致删除操作失败。 #### 解决方案 解决上述问题的关键在于按照正确的顺序执行删除操作,即先...

    Zend Framework 多表关联 数据库操作、事务处理

    本文将深入探讨在Zend Framework中如何进行多表关联的数据库操作以及事务处理。 首先,让我们了解多表关联。在数据库设计中,当多个表之间存在关系时,我们称之为多表关联。例如,用户表和订单表之间的关联,用户...

    springmvc 两张表增删改查,关联以及登录功能

    在这个项目中,我们讨论的核心是如何利用这两个框架来实现两个表的增删改查、表之间的关联以及用户登录功能。 首先,我们要理解 MVC 架构。Model 是业务逻辑处理,它处理数据并响应 View 和 Controller 的请求。...

    更新关联表的值

    在数据库设计中,当两个或更多表之间存在关系时,我们通常会创建一个关联表来存储这些关系。例如,在用户和角色的关系中,一个用户可以有多个角色,这种关系就可通过一个关联表来表示,其中包含用户ID和角色ID。 在...

    Zend Framework教程之Zend_Db_Table表关联实例详解

    例如,在处理多对多关系时,通常需要一个额外的关系表,即所谓的关联表,用于存储两个表之间的关联数据。在本教程中,`BugsProducts`表充当了关系表的角色,它连接了`Bugs`和`Products`两个表。在`Bugs`和`Products`...

    sap批量删除、添加、修改透明表数据

    如果错误地执行了删除操作,可能会导致数据丢失。因此,在编写代码时必须非常小心。 **示例代码:** ```abap REPORT ZTEST006 MESSAGE-ID zmess. DATA: lr_t_dtab TYPE REF TO data. "定义一个能够接纳任何数据...

    Test多表联合增删改查,struts两个JAVABEAN

    例如,如果有两个关联的表A和B,我们可能需要创建两个对应的JavaBean,一个表示表A,另一个表示表B。在进行联合查询时,这两个Bean可能会被合并成一个复合Bean,用于一次性处理两个表的数据。 接下来,涉及到SSH...

    listView,Gridview全选反选关联及删除操作

    总之,ListView和GridView的全选、反选及关联删除操作是Android应用中常见的功能需求。通过理解Adapter机制和事件监听,开发者可以轻松实现这些功能,提高用户体验。在实现过程中,应注重性能优化,确保操作流畅,...

    android ormlite多表关联实例

    在ORMLite中,删除操作也很简单。删除一个User会自动删除与其关联的所有Order,因为我们在设置`foreignAutoDelete`为true。更新操作也类似,只需获取对象,修改属性,然后调用update方法即可。 在提供的示例代码中...

    mysql删除关联表的实操方法

    在MySQL数据库系统中,当表之间存在关联时,执行删除操作前需要特别小心,因为不当的删除会破坏数据的完整性,导致关联表的结构和数据出现问题。关联表通常通过外键来建立关联关系,外键是用于约束两个表之间数据的...

    两个表 关于树的组合

    JOIN操作将两个表连接在一起,基于它们之间的关联字段。例如,如果我们有一个`parent_id`字段在子表中引用父表的`id`,那么可以使用INNER JOIN或LEFT JOIN来获取所有子节点。如果树结构非常深,可能需要递归查询,...

Global site tag (gtag.js) - Google Analytics