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

Откуда:
Сообщений: 32
Помогите, пожалуйста решить иерархическую задачку.

Имеются следующие таблицы:
1.COSTCENTERS

costc costcname costcdes costctree costctype burdentype ecostcdes fieldnum inactive
38111KU-ynapmocretni-selaS169D0Sales, intercompany, UK1
44121LI ytrap dr3 selaS176D0Sales 3rd party IL1
46211KU latneR looP179D0Pool Rental UK 1


2.COSTCTREE
Указывает ветку для каждого COSTC в таблице COSTCENTERS

costctreecostctreecodecostctreedesentry1entry2ecostctreedes
1661**selaS1** 1**Sales
1672** looP2** 2**Pool
16811*ynapmocretni ,selaS1**11*Sales, intercompany
169111KU ,ynapmocretni ,selaS1**11*Sales, intercompany, UK
17512*ytrap dr3 selaS1**12*Sales 3rd party
176121LI ytrap dr3 selaS1**12*Sales 3rd party IL
17821*latneR looP2**21*Pool Rental
179211KU latneR looP2**21*Pool Rental UK



Если мы возьмем первую строку из таблицы COSTCENTERS, где costc = 38 и проверим с помощью колонки costctree = 169 в таблице COSTCTREE кто является прямым родителем, то мы получим что прямым родителем для данной строки является строка из таблицы COSTCTREE с costctree = 168, а прямым родителем costctree = 168 явля costctree = 166.

В конечном результате мне нужно получить следующую таблицу с parent-child отношением:


costc costcname costc_parent costcdes costctree costctype burdentype ecostcdes fieldnum inactive
38111-168KU-ynapmocretni-selaS169D0Sales, intercompany, UK1
-16811*-166ynapmocretni ,selaSSales, intercompany
-1661**selaSSales
44121-175LI ytrap dr3 selaS176D0Sales 3rd party IL1
-17512*-166ytrap dr3 selaSSales 3rd party
46211-178KU latneR looP179D0Pool Rental UK1
-17821*-167latneR looPPool Rental
-1672**looPPool
30 апр 12, 22:19    [12491288]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
iljy
Member

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

смотрите в БОЛ примеры рекурсивных CTE, там есть работа с деревьями.
30 апр 12, 22:47    [12491335]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
sviha
Member

Откуда:
Сообщений: 32
Что-то у меня не получается адаптировать рекурсивный CTE с примеров под эту задачу. Никак не выходит.
30 апр 12, 22:53    [12491346]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
iljy
Member

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

что именно не выходит?
30 апр 12, 23:16    [12491400]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
sviha
Member

Откуда:
Сообщений: 32
Основная проблема, не работать уже с готовым отношением родитель-потомок (например как emp_id, manager_id) , а именно определить для каждого потомка его прямого родителя.
30 апр 12, 23:30    [12491432]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
iljy
Member

Откуда:
Сообщений: 8711
sviha
Основная проблема, не работать уже с готовым отношением родитель-потомок (например как emp_id, manager_id) , а именно определить для каждого потомка его прямого родителя.

Эээээ... А как вы определяете родителя для потомка?
1 май 12, 12:03    [12492053]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
sviha,

Почему
costc costcname costc_parent
44121-175
-17512*-166

а не
costc costcname costc_parent
44121-175
-17512*-166
-1661**
?
1 май 12, 13:12    [12492137]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
sviha
Member

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


costccostcnamecostc_parent
-1661**

Так эта строка существует в конечной таблице, которую я представил, просто в другом порядке.
Порядок тут не важен, главное чтобы иерархические связи были верными.
1 май 12, 14:21    [12492324]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
iljy
Member

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

еще раз спрашиваю, сосредоточтесь. Каким образом у вас задаются иерархические связи?
1 май 12, 15:41    [12492481]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
aleks2
Guest
iljy
sviha,

еще раз спрашиваю, сосредоточтесь. Каким образом у вас задаются иерархические связи?


Я сосредоточился, взглянул в мой хрустальный шар и определил
costctree  
1**
11*
111
Тредстартер сумел изобрести лисапед с квадратными колесами.
1 май 12, 19:51    [12493010]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
iljy
Member

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

это я видел. Хотелось, чтоб ТС сам это сформулировал, а там и до мысли заменить связь между уровнями в примерах на его изобретение недалеко.
1 май 12, 20:57    [12493178]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
sviha
Member

Откуда:
Сообщений: 32
Да это не я изобрел.
Так представлена таблица в хранилище данных одной компании, а я наоборот хочу изменить структуру на стандартную - parent/child.

aleks2 все понял правильно, в данном примере есть 3 уровня.

costctreecode
1** (level1)
11* (level2)
111 (level3)

так же насчет:

2** (level1)
21* (level2)
211 (level3)
1 май 12, 23:08    [12493559]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
sviha,

Чтобы получить искомое, решайте задачу с другого конца -- сначала постройте иерархию по COSTCTREE от корня к листьям, а уже потом left join с COSTCENTERS.
1 май 12, 23:55    [12493658]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
iljy
Member

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

так в чем тогда проблема адаптировать примеры из БОЛ? Вы вполне можете получить ваш ид родителя для потомка, а дальше по аналогии.
2 май 12, 00:09    [12493682]     Ответить | Цитировать Сообщить модератору
 Re: Иерархический запрос  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
sviha
costctreecode
1** (level1)
11* (level2)
111 (level3)

так же насчет:
2** (level1)
21* (level2)
211 (level3)
hierarchyid
И нинадо никаих иерархических запросов.
3 май 12, 12:12    [12500068]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить