У меня есть таблица сотен услуг, которые я соскабливаю из стороннего веб-сервиса. У услуг есть несколько миллионов символов, которые я также получаю.Прослеживание иерархии SQL снизу вверх до определенного уровня
Иерархия по существу такова;
root
|_service1
| |_service1/sub1*
| |_service1/sub2
| |_service1/sub3
| |_service1/sub4
| | |_service1/sub4/sub1
| | |_**service1/sub4/sub1/leaf1**
| |
| |_service1/sub5
|
|_service2
|_service2/sub1
|_service2/sub2
|_service2/sub3
Так что я пытаюсь достичь - дается Id на лист, я хочу работать на дерево, пока не найдешь ветвь была IsActive верно, то вернуть это значение.
В этом примере я хочу найти действительную военную службу для листа /service1/sub4/sub1/leaf1
, который в данном случае является service1/sub1
До сих пор я использую Common Table Expression для работы с вершины вниз и установите дополнительный столбец ActiveServiceId на листьях, находящихся под этой ветвью; с миллионами символов, которые превращаются в очень длительный процесс.
Я работаю только с очень маленьким подмножеством символов (хотя я не знаю, какие из них мне нужны), поэтому известные идентификаторы листа во время запроса будут всего в несколько сотен.
Я создал SQLFiddle, чтобы отразить эту иерархию, чтобы помочь каждому, кто мог бы быть в состоянии помочь
UPDATE для дальнейшего объяснения существующего подхода. Если я решил, что service1
станет новой активной услугой - листья под сервисом 1 в каждой дочерней ветви должны пузыриться до обслуживания1, и я сброшу все дочерние ветви, поэтому ни один из них не будет отмечен как активный
Вы рассмотрели использование иерархических типов данных ?: http://technet.microsoft.com/en-us/library/bb677173.aspx – Jayvee
Я только что прочитал эту полезную информацию, но теперь я не знаю, Думаю, что это решит эту проблему. – owen79