我的要求是从db2表中删除包含重复电话号码的数据(无效电话号码,16个电话号码的硬编码)。应保留一个电话号码,这取决于序列号(最小值)。
考虑主表有以下数据:PHONE_TAB
Client_Id Phone_num Seq_num
1234 45678 15 --- delete
4444 55555 45
1234 45678 10 ---should be retained
5555 22222 25
1234 45678 20 --- delete
1234 45678 11 --- delete
注意:在删除之前我还必须将要删除的行移到输出磁带文件中进行备份。
提出了以下逻辑, 声明光标:
EXEC SQL
DECLARE CUR1 CURSOR WITH HOLD FOR
SELECT * FROM PHONE_TAB WHERE PHONE_NUM = 45678
END-EXEC
FETCH-PARA
EXEC SQL
FETCH CUR1 INTO :DCLGEN_CLIENT_ID
:DCLGEN_PHONE_NUM
:DCLGEN_SEQ_NUM
END-EXEC
VALIDATE-PARA
EXEC SQL
SELECT MIN(SEQ_NUM) FROM PHONE_TAB
WHERE CLIENT_ID = :DCLGEN_CLIENT_ID
PHONE_NUM = :DCLGEN_PHONE_NUM GROUP BY CLIENT_ID AND PHONE_NUM
INTO WS_MIN
END-EXEC
EVALUATE TRUE
WHEN SEQ_NUM > WS_MIN
PERFORM BACKUP-PARA
WHEN OTHER
PERFORM FETCH-PARA
最后,DELETE-PARA
EXEC SQL
DELETE FROM PHONE_TAB WHERE CURRENT CURSOR
END-EXEC
有人能告诉我这个逻辑是否正确吗? 我怀疑的是,如果没有备份到磁带文件,是否会进行批量删除?
由于
答案 0 :(得分:1)
您可以使用以下SQL
一次性删除它们DELETE FROM PHONE_TAB A
WHERE EXISTS (SELECT 1 FROM PHONE_TAB B
WHERE A.PHONE_NUM = B.PHONE_NUM AND
A.SEQ_NUM > B.SEQ_NUM)
它的工作原理是删除存在另一行的所有行,这些行具有相同的电话号码和较低的序列号。
您可以通过首先使用select运行它来检查它是否删除了正确的行,例如
SELECT * FROM PHONE_TAB A
WHERE EXISTS (SELECT 1 FROM PHONE_TAB B
WHERE A.PHONE_NUM = B.PHONE_NUM AND
A.SEQ_NUM > B.SEQ_NUM)
如果需要备份行,可以运行select然后删除行。