【问题标题】:Sql Cleanup script, delete from one table that's not in the otherSql Cleanup 脚本,从一个不在另一个表中的表中删除
【发布时间】:2015-07-28 12:36:00
【问题描述】:

我们在 SQL(DB2) as400 中编写了一个清理脚本来清理表。 ps 我们正在修复导致数据问题的进程。

SQL:DELETE FROM p6prodpf A WHERE (0 = (SELECT COUNT(*) FROM P6OPIPF B WHERE B.OPIID = A.OPIID))

它的简单代码检查p6prodpf中是否存在P6OPIPF中没有记录的记录,然后删除p6prodpf中的记录。

我面临的问题是,即使P6OPIPF 中有记录,p6prodpf 也会被删除。

有没有更好的方法或更安全的方法.. 是否有任何原因会发生这种情况。

脚本在凌晨 3 点运行。

这也感觉像是一个排序问题,但是当我检查 P6OPIPF 中的记录时,它存在但它在 p6prodpf 中被删除了。

【问题讨论】:

    标签: sql database db2 db2-400


    【解决方案1】:

    使用“不存在”而不是“0 =”:

    DELETE FROM p6prodpf A WHERE NOT EXISTS (SELECT 1 FROM P6OPIPF B WHERE B.OPIID = A.OPIID)
    

    【讨论】:

    • NOT EXISTS 更好的选择。但我不明白这如何解决 OP 提到的问题。
    • 另外,如果脚本在匹配记录添加到 P6OPIPF 之前运行,这也可以解释您的问题。
    • 同意@GordonLinoff,NOT EXISTS 是一个更好的选择,但不应该有任何不同。在将记录添加到P6OPIPF 之前,Russ 可能在正确的轨道上运行脚本以从P6PRODOF 中删除。我建议使用日志来确定何时添加记录。
    • 感谢您的意见,我将使用日志来确定何时添加记录以及发生的顺序。当我知道是什么导致我的问题时,我会更新答案。
    猜你喜欢
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 2012-09-10
    • 2017-05-20
    相关资源
    最近更新 更多