Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Mssql полный путь для узла дерева рекурсией.  [new]
Lamer666
Member

Откуда:
Сообщений: 83
Добрый день.
Имеется таблица описывающая дерево:
id, parent_id,name

В таблице ищу какое нибудь значение по полю 'name', выполняю запрос вида: select top 5 * from table where name LIKE '....%'

Вопрос: как рекурсивным запросом для каждой найденной строки, в отдельном поле, показать полный путь, начиная от корня дерева?
Спасибо.
15 дек 15, 15:26    [18563322]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
MKDT
Guest
https://msdn.microsoft.com/ru-ru/library/ms186243(v=sql.105).aspx
15 дек 15, 15:43    [18563432]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Lamer666
Member

Откуда:
Сообщений: 83
MKDT,

Я ознакомился в этим примером, но у меня получается при выборке множество комбинаций:
Заливной
Заливной\Башмаковский
Заливной\Башмаковский\Пензенская
Заливной
Заливной\Палласовский
Заливной\Палласовский\Волгоградская


а мне нужно в результате запроса получить всего две строки вида:
Заливной, Башмаковский\Пензенская
Заливной, Палласовский\Волгоградская


то есть найти все поселки с названием "Заливной", но при этом рядом в поле отобразить к какому району и региону соответсвенно относиться тот или иной поселок.
15 дек 15, 17:43    [18564105]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Добрый Э - Эх
Guest
Lamer666,

ну так показывай, как делал.... такое ощущение, что дерево строил не в ту сторону. так-то идея примерно следующая - строишь один раз полное дерево, с путями и выбираешь из него нужные ветки/элементы
15 дек 15, 17:47    [18564125]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Lamer666
Member

Откуда:
Сообщений: 83
Добрый Э - Эх,

WITH H AS
(

SELECT CAST([FORMALNAME] AS NVARCHAR(300)) AS path,*
FROM [dbo].[ADDROBJ_link]
WHERE [FORMALNAME] LIKE N'Заливной%' AND [LIVESTATUS]=1 AND [AOLEVEL]<7
UNION ALL

SELECT CAST(H.path + '\' + T.[FORMALNAME] AS NVARCHAR(300)),T.*
FROM [dbo].[ADDROBJ_link] T INNER JOIN H ON T.[AOGUID]= H.[PARENTGUID]
)

SELECT * FROM H



Отбор делаю из бд fias
15 дек 15, 20:10    [18564919]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Lamer666
MKDT,


а мне нужно в результате запроса получить всего две строки вида:
Заливной, Башмаковский\Пензенская
Заливной, Палласовский\Волгоградская




[AOLEVEL] = 3
15 дек 15, 22:35    [18565323]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Lamer666
Member

Откуда:
Сообщений: 83
Lepsik,

Куда это применить?
15 дек 15, 23:38    [18565512]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Lamer666
Member

Откуда:
Сообщений: 83
Неужели никто не подскажет как для каждой строки загрузить полный путь рекурсивным подзапросом?
17 дек 15, 14:35    [18573247]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Lamer666
Неужели никто не подскажет как для каждой строки загрузить полный путь рекурсивным подзапросом?

Вы не можете из 6ти записей
Заливной
Заливной\Башмаковский
Заливной\Башмаковский\Пензенская
Заливной
Заливной\Палласовский
Заливной\Палласовский\Волгоградская

отфильтровать 2 нужные по [AOLEVEL] = 3 ?
17 дек 15, 14:42    [18573284]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Lamer666
Member

Откуда:
Сообщений: 83
Glory,

Могу, но [AOLEVEL] = 3 это уровень районов, в результате такого критерия я получу строки с районами, без населенных пунктов и без регионов, а мне надо:

п. Заливной, п.Заливной\р-н Башмаковский\обл.Пензенская
п. Заливной, п.Заливной\р-н Палласовский\обл.Волгоградская

найти населенный пункт соответствующий критерию например (LIKE "Заливно%") и рядом в отдельном столбце полный путь от региона до населенного пункта или города.
17 дек 15, 17:47    [18574203]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
Lamer666,

Для этого в cte надо хранить-собирать маску типов
например: 010203 или 0103 где 01- поселок, 02 - квартал, 03 - область и дальше по этому шаблону в WHERE вы сможете отфильтровывать нужный pattern
17 дек 15, 21:22    [18575098]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Lepsik
Member

Откуда: glubinka
Сообщений: 4256
А почему вместо FORMALNAME не ставить FULLNAME?
17 дек 15, 21:27    [18575120]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Lamer666
Member

Откуда:
Сообщений: 83
Lepsik
А почему вместо FORMALNAME не ставить FULLNAME?

О каком FULLNAME идет речь?

Вот структура таблицы ADDROBJ:
ACTSTATUS int NULL,
AOGUID nvarchar(36) NOT NULL,
AOID nvarchar(36) NOT NULL,
AOLEVEL int NULL,
AREACODE nvarchar(3) NULL,
AUTOCODE nvarchar(1) NULL,
CENTSTATUS int NULL,
CITYCODE nvarchar(3) NULL,
CODE nvarchar(17) NULL,
CURRSTATUS int NULL,
ENDDATE date NULL,
FORMALNAME nvarchar(120) NULL,
IFNSFL nvarchar(4) NULL,
IFNSUL nvarchar(4) NULL,
NEXTID nvarchar(36) NULL,
OFFNAME nvarchar(120) NULL,
OKATO nvarchar(11) NULL,
OKTMO nvarchar(11) NULL,
OPERSTATUS int NULL,
PARENTGUID nvarchar(36) NULL,
PLACECODE nvarchar(3) NULL,
PLAINCODE nvarchar(15) NULL,
POSTALCODE nvarchar(6) NULL,
PREVID nvarchar(36) NULL,
REGIONCODE nvarchar(2) NULL,
SHORTNAME nvarchar(10) NULL,
STARTDATE date NULL,
STREETCODE nvarchar(4) NULL,
TERRIFNSFL nvarchar(4) NULL,
TERRIFNSUL nvarchar(4) NULL,
UPDATEDATE date NULL,
CTARCODE nvarchar(3) NULL,
EXTRCODE nvarchar(4) NULL,
SEXTCODE nvarchar(3) NULL,
LIVESTATUS int NOT NULL,
NORMDOC nvarchar(36) NULL
18 дек 15, 09:22    [18576332]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Lamer666
Glory,

Могу, но [AOLEVEL] = 3 это уровень районов, в результате такого критерия я получу строки с районами, без населенных пунктов и без регионов, а мне надо:

п. Заливной, п.Заливной\р-н Башмаковский\обл.Пензенская
п. Заливной, п.Заливной\р-н Палласовский\обл.Волгоградская

найти населенный пункт соответствующий критерию например (LIKE "Заливно%") и рядом в отдельном столбце полный путь от региона до населенного пункта или города.

Ееще раз вопрос

Вы не можете из 6-ти _уже полученных_ записей
Заливной
Заливной\Башмаковский
Заливной\Башмаковский\Пензенская
Заливной
Заливной\Палласовский
Заливной\Палласовский\Волгоградская

отфильтровать 2 _нужные_ ?
18 дек 15, 10:37    [18576618]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Lamer666
Member

Откуда:
Сообщений: 83
Glory
Lamer666
Glory,

Могу, но [AOLEVEL] = 3 это уровень районов, в результате такого критерия я получу строки с районами, без населенных пунктов и без регионов, а мне надо:

п. Заливной, п.Заливной\р-н Башмаковский\обл.Пензенская
п. Заливной, п.Заливной\р-н Палласовский\обл.Волгоградская

найти населенный пункт соответствующий критерию например (LIKE "Заливно%") и рядом в отдельном столбце полный путь от региона до населенного пункта или города.

Ееще раз вопрос

Вы не можете из 6-ти _уже полученных_ записей
Заливной
Заливной\Башмаковский
Заливной\Башмаковский\Пензенская
Заливной
Заливной\Палласовский
Заливной\Палласовский\Волгоградская

отфильтровать 2 _нужные_ ?


НЕТ!!!!
Результат получается вида:

Заливной, ID поселка "Заливной"
Заливной\Башмаковский, ID района "Башмаковский"
Заливной\Башмаковский\Пензенская, ID края "Пензенская"
Заливной, ID поселка "Заливной"
Заливной\Палласовский, ID района "Палласовский"
Заливной\Палласовский\Волгоградская, ID района "Волгоградская"

а мне надо
Заливной\Башмаковский\Пензенская (тут путь полный от потомка "Заливной" до предка "Пензенская " обл), ID поселка "Заливной"
Заливной\Палласовский\Волгоградская(тут путь полный от потомка "Заливной" до предка "Волгоградская" обл), ID поселка "Заливной"

то есть каждому найденному поселению или городу с их ID нужно отдельным полем получить полный путь от предка до найденного потомка!!!!
18 дек 15, 11:01    [18576786]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Glory
Member

Откуда:
Сообщений: 104760
Lamer666
а мне надо
Заливной\Башмаковский\Пензенская (тут путь полный от потомка "Заливной" до предка "Пензенская " обл), ID поселка "Заливной"
Заливной\Палласовский\Волгоградская(тут путь полный от потомка "Заливной" до предка "Волгоградская" обл), ID поселка "Заливной"

Вы тупой ?
У вас ID поселка "Заливной" в своем поле, а полный путь от него до родителя - в другом поле.
Вы не можете вывести 2 поля в запросе что ли ?
18 дек 15, 11:03    [18576806]     Ответить | Цитировать Сообщить модератору
 Re: Mssql полный путь для узла дерева рекурсией.  [new]
Lamer666
Member

Откуда:
Сообщений: 83
Glory
Lamer666
а мне надо
Заливной\Башмаковский\Пензенская (тут путь полный от потомка "Заливной" до предка "Пензенская " обл), ID поселка "Заливной"
Заливной\Палласовский\Волгоградская(тут путь полный от потомка "Заливной" до предка "Волгоградская" обл), ID поселка "Заливной"

Вы тупой ?
У вас ID поселка "Заливной" в своем поле, а полный путь от него до родителя - в другом поле.
Вы не можете вывести 2 поля в запросе что ли ?


Не нужно разговаривать в таком тоне, мягче пожалуйста.

Я надеюсь что вы видите что при включении в отбор условия [AOLEVEL] = 3 приводит к тому, что будут отобраны строки уровня "РАЙОНЫ", и там абсолютно не будут появляться строки уровня "НАСЕЛЕННЫЙ ПУНКТ" которые мне нужный!!!!!

На рисунке слева (для примера) два населенных пункта с их ID (AOGUID если быть точнее), справа отбор с предложенным вами критерием. Очевидно что отобранные AOGUID в правой части не принадлежат искомым НАСЕЛЕННЫМ ПУНКТАМ в левой части, а принадлежат РАЙОНАМ в которые входят искомые населенные пункты!


Картинка с другого сайта.

Еще раз повторяю: я ищу AOGUID населенных пунктов удовлетворяющих критерию (LIKE N'Залив%') при этом, в отдельном поле нужно собрать полный путь от региона до населенного пункта!!!!!
18 дек 15, 13:41    [18578053]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить