"Fun" с циклическими ссылками:
Предположим, у меня есть таблица ELEMENTS, которая содержит иерархию элементов, смоделированных с помощью идентификатора отца.
Поле идентификатора отца для корня равно нулю.
Все остальные записи имеют ненулевой идентификатор отца с первичным ключом (ID
) родительского элемента (с автопоследовательностью).
Например, используя
SELECT *
FROM Elements
WHERE FATHER_ID not in (SELECT ID FROM Elements)
Я могу найти все элементы, которые имеют недопустимые ссылки на отцов (FATHER_ID
не является внешним ключом, давайте предположим, что в этом примере).
Но как мне найти элементы, которые имеютдействительная ссылка на отца, НО, чья цепочка ссылок на отца не заканчивается в корне? Я думаю, что это может произойти только для циклических ссылок, например, A является отцом B, но B также является отцом A.Такое «поддерево» не связано с корнем и, следовательно, не является частью основного дерева. Я хочу найти такие поддеревья.
Конечно, я ищу запрос, который доставляет те элементы, которые приводят к циклической ссылке, независимо от длины цепочки ссылок.
Возможно ли это в SQL или мне нужно итеративное решение?