Есть ли способ в SQL для идентификации и маркировки деревьев, содержащих круговые отношения? - PullRequest
0 голосов
/ 24 апреля 2019

У меня есть большая таблица sql (из автомобильной промышленности), содержащая информацию, подобную следующему формату:

   NAME               ID   PARENTID    CHILDID  IN_LAW_ID
   ---------- ---------- ---------- ---------- ----------
   Bill                1          -          -         10
   Faye                2          -          -          -
   Joe                 3          2          1          -
   Billy               4          2          1          -
   Bob                 5          2          1          9
   Catherine           6          7          -          -
   Calvin              7          6          4          -
   Achmed              8          -          -          -
   Rachel              9          -          -          5

(ну, на самом деле, названия - это запасные части, родители будут предшественниками, дети-наследники и инопланетяне будут необязательными частями ...)

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

  • Например, у Ахмеда нет родителей, нет детей и нет преступников, поэтому он будет помечен как не имеющий семьи,

  • С другой стороны, Билл будет принадлежать к той же семье, что и Джо, и любому другому лицу, у которого есть ID, принадлежащий к тому же дереву (независимо от того, являются ли это отношениями PARENTID, CHILDID или IN_LAW_ID ).

Чтобы немного усложнить ситуацию, отношения в дереве могут быть круговыми.

  • т.е. Кэтрин может иметь Кэлвин как PARENTID, а Кэлвин может иметь Кэтрин как PARENTID.

Ах, и деревья могут стать довольно большими, с количеством членов до 3000.

В настоящее время мой подход заключается в использовании инструментов, предназначенных для сетевого майнинга, а также для извлечения и именования каждой отдельной подсети (т.е. полной подсети без подключения к другим сетям). Все же эти инструменты работают на моем ноутбуке и занимают целую неделю, чтобы сформировать окончательный список FAMILYID s.

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

Любая помощь будет высоко ценится!

...