我必须删除一些被认为无用的记录。
有一个地址文件和一个订单历史文件。在拥有消费品的公司里,他们会收到许多产品咨询或开始销售,但这些咨询或销售从未成为销售。
每次查询都会在地址文件中得到一条记录,即客户编号。在订单历史文件中是相同的客户编号和后缀字段。其从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,那么我们打开标志然后离开。
清除subr将不得不再次读取,以通过使用仍在读取地址文件中的相同客户编号从订单历史文件中获得需要清除的记录。因为我不确定subr有什么价值,对于客户来说,我不想存储它。
然后它会写入新文件,包括地址文件,然后我们可以读取下一个地址文件中的客户。
我们也不能假设,如果有人真的买了,他们有一个001,也许它多年来被删除了。
如果我们这样做了,我可以简单地抓住它。
在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。
-- 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'
)