У меня есть большая таблица 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.)
Любая помощь будет высоко ценится!