Обычный способ сделать это, если в вашем варианте SQL нет специальной нестандартной функции, это построить таблицу путей, в которой есть следующие столбцы:
- parent_key
- child_key
- PATH_LENGTH
Чтобы заполнить эту таблицу, вы используете рекурсивный или процедурный цикл, чтобы найти всех родителей, прародителей, прабабушек и т. Д. Для каждого элемента в вашем списке элементов. Рекурсия или цикл должны продолжаться до тех пор, пока вы не прекратите находить более длинные пути, которые возвращают новые пары.
В конце концов, у вас будет список записей, которые сообщают вам такие вещи, как (a, b, 1), (a, f, 2), (a, h, 3) и т. Д. Затем, чтобы получить все то есть на уровне x и выше, вы делаете отдельный выбор для всех дочерних элементов с path_length <= x (объединенным с корнем, если только вы не включили запись (null, root, 0), когда вы запустили рекурсию / цикл . </p>
Было бы неплохо, если бы SQL лучше справлялся с ориентированными графами (деревьями), но, к сожалению, вы должны обмануть его с помощью дополнительных таблиц, подобных этой.