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