Скрипт очистки sql, удаление из одной таблицы, которой нет в другой

Мы написали сценарий очистки на SQL (DB2) as400 для очистки таблиц. ps мы исправляем процессы, которые вызывают проблемы с данными.

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

Это простой код, проверяющий, есть ли в p6prodpf запись, не имеющая записи в P6OPIPF, а затем удалите запись в p6prodpf.

Моя проблема, с которой я столкнулся, заключается в том, что есть случаи, когда p6prodpf удаляется, даже если есть запись в P6OPIPF.

Есть ли способ сделать это лучше или безопаснее .. Есть ли причина, по которой это могло происходить.

Скрипт запускается в 3 часа ночи.

Это также похоже на проблему с секвенированием, но когда я проверяю запись в P6OPIPF, она существует, но удалена в p6prodpf.


person Renier    schedule 28.07.2015    source источник


Ответы (1)


Используйте «НЕ СУЩЕСТВУЕТ» вместо «0 =»:

DELETE FROM p6prodpf A WHERE NOT EXISTS (SELECT 1 FROM P6OPIPF B WHERE B.OPIID = A.OPIID)
person Russ    schedule 28.07.2015
comment
NOT EXISTS - лучший выбор. Но я не понимаю, как это решает проблему, о которой упоминает ОП. - person Gordon Linoff; 28.07.2015
comment
Кроме того, если сценарий запускается ДО того, как соответствующие записи были добавлены в P6OPIPF, это также может объяснить вашу проблему. - person Russ; 28.07.2015
comment
Согласитесь с @GordonLinoff, NOT EXISTS - лучший выбор, но не должно работать иначе. Расс, вероятно, находится на правильном пути с запуском сценария для удаления из P6PRODOF до того, как записи будут добавлены в P6OPIPF. Я предлагаю использовать журналы, чтобы определить, когда добавляются записи. - person Charles; 28.07.2015
comment
Спасибо за ваш вклад, я собираюсь использовать журналы, чтобы определить, когда добавляются записи и в какой последовательности это происходит. Я обновлю ответ, когда узнаю, что вызвало мою проблему. - person Renier; 29.07.2015