SQL SELECT для поиска циклических ссылок в организованном по отцовскому ID дереве?

"Забава" с циклическими ссылками:

Предположим, у меня есть таблица 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, или мне нужно итерационное решение?

6
задан TheBlastOne 27 April 2011 в 11:48
поделиться