W Augur Ответов: 1

Может ли кто-нибудь порекомендовать (SQL? ) Алгоритм разрешения множественных много-много исключений


Во - первых, я здесь новичок-так что я рад быть шлепнутым, если это тривиальный вопрос, на который уже был дан ответ, или я разместил его совершенно не в том месте.

Я бывший разработчик, который серьезно заржавел, и я столкнулся с проблемой, которая меня заблокировала. Это может быть очевидно для кого-то более опытного, но после мозгового штурма, обсуждения и поиска этого я в настоящее время ничего не знаю.

Я работаю над устаревшей системой с довольно ужасной структурой данных, с которой у меня нет вариантов что-либо сделать. Ниже приведено упрощение проблемы, но я думаю, что это лучший способ объяснить ее.

Что касается того, что я пытаюсь сделать :

В базе данных у меня есть записи отгрузки A-G

Я хочу удалить все завершенные поставки. Отгрузки A-E завершены, но не F или G.

В системе также есть несколько счетов-фактур.

Правила :

1. Если завершенная отгрузка является частью счета-фактуры, содержащей другие незавершенные отгрузки, она не может быть удалена

2. Если завершенная отгрузка является частью счета-фактуры, содержащей другие отгрузки, которые не могут быть удалены, она не может быть удалена

Проблема :

- Счет I1 содержит отгрузки A, B и C. Поскольку все они завершены, я мог бы удалить их все

- Счет I2 содержит отгрузки A, F и G. поскольку F & G не заполнены, я не могу удалить ни одну из них

- Но поскольку а не может быть удалено по правилу 1, поскольку оно является частью счета I1, то и в или С не могут быть удалены

..затем нам нужно будет проверить все другие счета-фактуры, частью которых являются B & C...

..и так до бесконечности...

..и ни за что на свете я не могу придумать простого, быстрого SQL-оператора или алгоритма, чтобы сделать это иначе, чем с помощью грубой силы или рекурсии-до-конца

Любые альтернативные предложения с благодарностью принимаются!

Извиняюсь также, если это очевидно, но я просто переоцениваю это / не вижу очевидного сам..

Что я уже пробовал:

Я пробовал загружать все завершенные отгрузки во временную таблицу и неоднократно запускал "является членом счета-фактуры, содержащей незавершенные отгрузки" и "является членом счета-фактуры, содержащей не удаляемые отгрузки", пока не получу ложный результат..

.но это не кажется очень эффективным...

1 Ответов

Рейтинг:
2

OriginalGriff

Во - первых, нет, это правильное место-и добро пожаловать в КП!

SQL имеет предложение EXCEPT: Кроме и пересекаются (Transact-SQL)[^], который удаляет записи из одного запроса, присутствующие в другом.
Так что я бы сделал вот что:
1) Выберите все завершенные отгрузки.
2) Выберите все отгрузки, которые находятся в счетах-фактурах с незавершенными номенклатурами.
3) Используйте, кроме как удалить все в 2 из 1.
4) выберите Счета-фактуры, которые содержат только товары, оставшиеся в 3.

Я не знаю, насколько это сложно сделать с вашей системой - я не знаю структуру данных, - но это должно решить три выбора:

SELECT ... FROM
   (SELECT completed
    EXCEPT SELECT uncompleted)
Либо с соединением, либо с WHERE на внешнем, в зависимости от вашей структуры данных.
Как только я проверю его чертовски тщательно, он может стать удалением.