Sql Cleanup 脚本,从一个不在另一个表中的表中删除

Posted

技术标签:

【中文标题】Sql Cleanup 脚本,从一个不在另一个表中的表中删除【英文标题】:Sql Cleanup script, delete from one table that's not in the other 【发布时间】: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 中被删除了。

【问题讨论】:

【参考方案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 中删除。我建议使用日志来确定何时添加记录。 感谢您的意见,我将使用日志来确定何时添加记录以及发生的顺序。当我知道是什么导致我的问题时,我会更新答案。

以上是关于Sql Cleanup 脚本,从一个不在另一个表中的表中删除的主要内容,如果未能解决你的问题,请参考以下文章

从表中选择字段,其中 id 不在 mysql 的另一个表中 [不工作]

sql 判断一个表的数据不在另一个表中

SQL查询以查找ID不在另一个表中的记录

如何使用 DB2 sql 检查不在两个表中的记录以获取另一个第三个表中的日期?

SQL 存在一个表而不在另一个表中的数据

SQL中,如何查询存在一个表而不在另一个表中的数据记录