【问题标题】:Purging records on AS/400清除 AS/400 上的记录
【发布时间】:2013-06-30 02:56:30
【问题描述】:

我必须删除一些被认为无用的记录。

有一个地址文件和一个订单历史文件。在拥有消费品的公司中,他们会收到许多产品咨询或开始销售,但从未成为销售。

每次查询都会在地址文件中获得一条记录,即客户编号。在订单历史文件中是相同的客户编号和后缀字段。它从 000 开始,并在有新订单时递增。大部分业务实际上是一个循环模型。

只有“000”记录(可能有多个 000)的客户,意味着他们从未购买过我们希望从这些文件中清除的任何东西。

我正在考虑一个简单的 RPG 程序,但如果可能的话,我也对使用 SQL 或其他方法感兴趣。

在这个阶段,我们实际上不会删除,而是将建议的记录复制到一个输出文件中,该文件将被审查并存储起来以备不时之需。

F Addressfile   IF  E

F OrderHistory  IF  E

**** create 2 output file clones but with altered name for now.

F Zaddressfile  O  E
F ZorderHistory O  E


                  *inlr    doweq *off
                           Read  Addressfile          lr
                  *inlr    ifeq *off
                           move  *off      Flg000
                           exsr  Chk000
                   Flg000  ifeq  *on
                           iter
                           else  exsr      purge
                           endif
                           endif
                           enddo

                   Chk000  begsr

**基本上在 orderhistory 上设置为不同的逻辑 只要我们有匹配的客户编号,就可以阅读 如果有后缀 not = 000 那么我们打开标志 然后出去。

purge subr 将不得不再次读取以获取从 orderhistory 文件中清除所需的记录,方法是使用仍在读取地址文件中的相同客户编号。因为我不确定 subr 对客户有什么价值,我不想存储它。

然后它将写入新文件,包括地址文件,然后我们可以迭代读取下一个 地址文件中的客户。

我们也不能假设如果有人买了,他们有一个 001,也许它多年来被删除了。

如果我们这样做了,我可以简单地链接它。

【问题讨论】:

  • 问题是什么?
  • 我可以发誓我读过一些文章,显示使用 SQL 进行批处理相对于原生 IO 的速度提升,但不知道它现在在哪里。有趣的是,我在这里重新编写了一个流程(以及一些新的索引,这些索引对于原生 IO 来说很难“使用”),从大约 24 小时……到 2 小时。

标签: db2 ibm-midrange rpgle db2-400


【解决方案1】:

您在 RPG 中必须执行的各种步骤。这可以在 SQL 中以多种更简单的方式完成。 SQL 擅长同时处理和分析整个文件中的记录组。

CREATE TABLE zaddresses AS
( SELECT *
    FROM addressFile
    WHERE cust IN (SELECT cust 
                     FROM orderHistory
                     GROUP BY cust
                     HAVING max(sufix)='000'
                  )
) 
WITH DATA
NOT LOGGED INITIALLY;

CREATE TABLE zorderHst AS 
( SELECT * 
    FROM orderHistory
    WHERE cust IN (SELECT cust 
                     FROM zaddresses
                  )
)
WITH DATA
NOT LOGGED INITIALLY;

在那里,您已经定义了您的持有表并在每个单独的语句中填充了它。它确实有一些嵌套逻辑,但仍然只有两条语句。

清除它们

DELETE FROM addressfile
  WHERE cust IN (SELECT cust FROM zaddresses);

DELETE FROM orderHistory
  WHERE cust IN (SELECT cust FROM zaddresses);

总共有四个 SQL 语句。 (我什至不会问你的 RPG 程序中有多少)

一旦您了解 SQL,您就可以考虑处理整个文件,而不仅仅是逐条记录指令。完成事情要简单得多并且做得好几乎总是更快。

(您可能会听到关于特定情况下性能的争论,但大多数情况下,他们根本没有按照应有的方式使用 SQL。如果您编写的 RPG 很差,它的性能也会很差。;-)

【讨论】:

  • 好的,这看起来很不错。实际上我有一个可以用于 sql 部分的资源。当你在这里有 1 个问题 "WHERE cust IN (SELECT cust FROM orderHistory GROUP BY cust" HAVING max(sufix)='000' ) 这意味着订单历史中这个客户编号的所有此类记录都是 = 000 吗?这个想法对我来说很不错。
  • 除非这不会创建您的订单历史备份。
  • @Booksman 是的。 WHERE 子句预先过滤记录,决定是否在对它们进行任何其他处理之前将它们包括在内以供考虑。 HAVING 子句过滤由 GROUP BY 子句产生的数据。所以HAVING max(sufix)='000' 意味着在为客户组检查所有行之后,最大值是“000”,或者换句话说,没有找到大于“000”的客户行。 WHERE cust IN 子查询 ) 表示客户必须在子查询返回的集合中,也就是没有后缀>'000'的客户集合。
【解决方案2】:

我会使用 SQL。

-- Save only the rows to be deleted
CREATE TABLE ZADDRESSFILE AS
   (SELECT *
    FROM   ADDRESSFILE af
    WHERE  NOT EXISTS
        (SELECT 1
         FROM ADDRESSFILE sub
         WHERE sub.CUSTNO = af.CUSTNO
         AND   sub.SUFFIX <> '000' -- (or <> 0 if numeric)
         )
    )

-- If ZADDRESSFILE exists and you want to add the rows 
-- to ZADDRESSFILE instead....
INSERT INTO ZADDRESSFILE
   (SELECT *
    FROM   ADDRESSFILE af
    WHERE  NOT EXISTS
        (SELECT 1
         FROM ADDRESSFILE sub
         WHERE sub.CUSTNO = af.CUSTNO
         AND   sub.SUFFIX <> '000' -- (or <> 0 if numeric)
         )
    AND OT EXISTS
         (SELECT 1
          FROM ZADDRESSFILE sub
          WHERE sub.CUSTNO = af.CUSTNO
          )
    )


-- Get number of rows to be deleted
SELECT COUNT(*)
FROM ADDRESSFILE af
WHERE NOT EXISTS
   (SELECT 1
    FROM   ADDRESSFILE sub
    WHERE  sub.CUSTNO = af.CUSTNO
    AND    sub.SUFIX <> '000'
    )


-- Delete 'em
DELETE
FROM ADDRESSFILE af
WHERE NOT EXISTS
   (SELECT 1
    FROM   ADDRESSFILE sub
    WHERE  sub.CUSTNO = af.CUSTNO
    AND    sub.SUFIX <> '000'
    )

【讨论】:

  • 这样不太行,因为后缀在订单历史文件中,而不是地址文件中。
猜你喜欢
  • 1970-01-01
  • 2013-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多