|  23.07.2014, 10:32 | #1 | 
| Участник | рекурсия 
			
			Подскажите пожалуйста, как данный запрос в MsSQL переписать на Х++. Использую СТЕ для раскрытия дерева, нахожу нужный мне уровень и вывожу отфильтрованные данные в итоговом запросе. Цитата: 
		
			;WITH countrySegmentation AS (SELECT TreeNodeId ,NAME ,PARENTTreeNodeId ,DATAAREAID ,0 Level FROM dbo.MULTILEVELSEGMENTTREE_ZTR UNION ALL SELECT t.TreeNodeId ,t.NAME ,t.PARENTTreeNodeId ,t.DATAAREAID ,Level+1 FROM countrySegmentation c JOIN dbo.MULTILEVELSEGMENTTREE_ZTR t ON c.TreeNodeId = t.PARENTTreeNodeId) select distinct mt.TREENODEID, mt.PARENTTREENODEID, mt.NAME, Level from MULTILEVELSEGMENTDATA_ZTR md join MULTILEVELSEGMENTTREE_ZTR mt on md.SEGMENTID = mt.SEGMENTID join countrySegmentation on mt.TREENODEID = countrySegmentation.TREENODEID where mt.SEGMENTID = 'География' and Level > 1 order by NAME Есть идеи ? | 
|  | 
|  23.07.2014, 12:29 | #2 | 
| Участник | 
			
			В каком виде вам нужно получить результат? Вам его нужно отобразить на форме или просто обойти в цикле?
		 | 
|  | 
|  23.07.2014, 12:33 | #3 | 
| Участник | |
|  | 
|  23.07.2014, 12:41 | #4 | 
| Участник | 
			
			Тогда все равно сначала обход дерева в цикле (можно рекурсивно)   Заполняйте временную таблицу и уже её выводите на форму. P.S.: Если такие операции с деревом необходимо выполнять часто, то лучше изменить структуру данных добавив как минимум номер строки, при помощи которого можно будет без рекурсии вычислить "границы" любого парента. | 
|  | 
|  23.07.2014, 12:53 | #5 | 
| Участник | 
			
			погугли Дерево каталогов NESTED SETS. по мне так самый удачный вариант реализации дерева
		 | 
|  | 
|  23.07.2014, 12:59 | #6 | 
| Участник | 
			
			На всякий случай, если вопрос был в том как именно можно обойти дерево X++: void dfs(int _parent) { MULTILEVELSEGMENTTREE_ZTR mt while select mt where mt.PARENTTreeNodeId == _parent { if (mt.SEGMENTID == 'География') { addToResultSet(mt); } dfs(mt.TreeNodeId) } } | 
|  | |
| За это сообщение автора поблагодарили: userax2009 (1). | |
|  23.07.2014, 14:33 | #7 | 
| Участник | 
			
			ошибка: Функция не была объявлена. Или это я должен создать метод addToResultSet, в котором будет происходит раскрытие дерева ? А как мне выполнить фильтрацию по уровню(Level) , как я делаю выше в запросе mssql? Последний раз редактировалось userax2009; 23.07.2014 в 14:46. | 
|  | 
|  23.07.2014, 14:47 | #8 | 
| Участник | Цитата: Да так же как и фильтрацию по SEGMENTID. | 
|  | 
|  24.07.2014, 16:10 | #9 | 
| Участник | 
			
			спасибо, все получилось
		 | 
|  |