На естественном языке это будет означать: «Удалить привязку предка-потомка к D, если нет родителя D, кроме B, который также является потомком A». Это правильно?
( Редактировать: нет, это не правильно; должны быть удалены не только привязки к D, но и привязки к каждому потомку D . Таким образом, этот критерий недействителен. ..)
Тогда мой предварительный SQL будет:
DELETE a
FROM Closure AS a
INNER JOIN Closure AS b ON a.Descendant = b.Descendant
WHERE
a.Descendant IN (SELECT Descendant FROM Closure WHERE Ancestor = {Child}) AND
b.Depth = 1 AND
b.Ancestor != {Parent} AND
a.Ancestor NOT IN (SELECT Ancestor FROM Closure WHERE Descendant = b.Ancestor)
(Извините, если я ошибся в запросе - или использовал нестандартные функции - я не очень разбираюсь в этом. Но мое описание на естественном языке должно дать представление о том, что на самом деле нужно для выполнения запроса)
Обновление: Если подумать, я не верю, что мой запрос будет работать для всех случаев. Учтите это:
A --> B --> D --> E --> F
- F является потомком D (True)
- E является родителем F (True)
- E не B (True)
- A не является предком E (False)
Таким образом, A >> F
не будет удален, даже если и должен. Извините, я не мог помочь, но эта проблема кажется слишком большой, чтобы поместиться в одном запросе. Я бы предложил сначала найти алгоритмическое решение, а затем посмотреть, как это можно реализовать в вашем случае.