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

Откуда:
Сообщений: 58
Добрый день!
Согласно статье на хабре, а также technet принялся для работы писать рекурсивный запрос.

Имеем например такие данные в таблице (схематично)


code__________parentCode_________name

-------------------------------------------------------------

1______________null______________уровень 0
2______________1_________________уровень 1
3______________null______________уровень 0
4______________2______________уровень 2



Задача: вытащить для code, равного 4 всех родителей (т.е. в результирующей выборке должно быть 3 строки: 1, 2, 4)
для этого я написал такой запрос:
with Codes(Code, ParentCode, Name)
as
(
	select Code, ParentCode, Name	from Table1
	union all
	select Table1.Code, Table1.ParentCode, Table1.Name
	from Codes join Table1 on Codes.Code = Table1.PARENTCODE
)
select Code, ParentCode, Name
from Codes
where Code = '4'         --искомое значение


В результате выходит следующее:
4______________2______________уровень 2
4______________2______________уровень 2
4______________2______________уровень 2

выбрано 3 строки



И не могу понять в чем проблема... подскажите, пожалуйста, свежим взглядом? Спасибо

СУБД: MS SQL Server 2008
17 фев 15, 12:06    [17275603]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
vasiliusis
подскажите, пожалуйста, свежим взглядом?

Уберите where Code = '4' и посмотрите, что вы навыбирали
17 фев 15, 12:08    [17275619]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
Добрый Э - Эх
Guest
0) якорная часть рекурсивного запроса задана неверно.
1) дерево строится не в ту сторону
3) фильтрация итогового "куста" выполнена неверно
17 фев 15, 12:10    [17275625]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
WITH Codes(Code, ParentCode, Name) AS
(
 SELECT Code, ParentCode, Name FROM Table1 WHERE Code=4
 UNION ALL
 SELECT Table1.Code, Table1.ParentCode, Table1.Name
 FROM Codes JOIN Table1 ON Codes.ParentCode = Table1.Code
)
SELECT * FROM Codes;
А так?
17 фев 15, 12:13    [17275636]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
vasiliusis
Member

Откуда:
Сообщений: 58
Добрый Э - Эх
0) якорная часть рекурсивного запроса задана неверно.
1) дерево строится не в ту сторону
3) фильтрация итогового "куста" выполнена неверно


ну понятно, что многое неверно... вот я и написал сюда. честно говоря, никогда с такими запросами не сталкивался, даже не до конца понимаю, как это все работает... буду разбираться
17 фев 15, 12:18    [17275664]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
vasiliusis
Member

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

помогло, спасибо!
17 фев 15, 12:19    [17275667]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
vasiliusis
Member

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

а можете прояснить алгоритм построения выборки?
17 фев 15, 12:26    [17275705]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
Glory
Member

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

Сначала выбирается нужный потомок " вытащить для code, равного 4". - SELECT Code, ParentCode, Name FROM Table1 WHERE Code=4

А потом рекурсивно все его предки
UNION ALL
SELECT Table1.Code, Table1.ParentCode, Table1.Name
FROM Codes JOIN Table1 ON Codes.ParentCode = Table1.Code
17 фев 15, 12:45    [17275805]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
vasiliusis
Member

Откуда:
Сообщений: 58
Glory, и еще последний вопрос: данную конструкцию можно использовать в качестве подзапроса?
17 фев 15, 13:59    [17276285]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
vasiliusis
данную конструкцию можно использовать в качестве подзапроса?

если вы про with, то нет
17 фев 15, 14:01    [17276298]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
vasiliusis
Member

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

да. я про with... а можно ли как-то обойтись без рекурсии для данной задачи? дело в том, что мне нужно из базы, в которой крутится MS Dynamics AX, вытащить данные в отчет на SSRS... писать процедуры как-то моветон..
17 фев 15, 14:06    [17276343]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
vasiliusis
да. я про with...

что вам мешает написать нужный запрос сразу с with ?

vasiliusis
а можно ли как-то обойтись без рекурсии для данной задачи?

- Хранить в каждой записи в виде строки всех предков
- использовать тип данных hierarchyid
- хранить дерево в формате, для которого не нужны рекурсивные запросы
17 фев 15, 14:10    [17276380]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
vasiliusis
Member

Откуда:
Сообщений: 58
Glory
что вам мешает написать нужный запрос сразу с with ?


ну в принципе это мысль, сейчас попробую...
17 фев 15, 14:18    [17276455]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
vasiliusis
Member

Откуда:
Сообщений: 58
Glory
- Хранить в каждой записи в виде строки всех предков
- использовать тип данных hierarchyid
- хранить дерево в формате, для которого не нужны рекурсивные запросы


видимо без рекурсии, в моем случае, действительно никак
17 фев 15, 14:23    [17276505]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
vasiliusis
видимо без рекурсии, в моем случае, действительно никак

Написать UDF, в которой эмулировать рекурсию циклами. Если, конечно, в этом состоит цель.
17 фев 15, 14:25    [17276520]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
vasiliusis
Member

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

я думаю, что писать что-то напрямую в БД (в обход MS DAX), что вьюхи, что процедуры, что функции - не есть хорошо
17 фев 15, 14:38    [17276649]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
vasiliusis
я думаю, что писать что-то напрямую в БД (в обход MS DAX), что вьюхи, что процедуры, что функции - не есть хорошо

Что мешает написать в соседную базу ?
17 фев 15, 14:45    [17276710]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
londinium
Member

Откуда: Киев
Сообщений: 1199
автор
- хранить дерево в формате, для которого не нужны рекурсивные запросы

А где про такое можно подробнее прочитать?
17 фев 15, 14:49    [17276750]     Ответить | Цитировать Сообщить модератору
 Re: Рекурсивный запрос выводит неверные данные  [new]
Glory
Member

Откуда:
Сообщений: 104751
londinium
автор
- хранить дерево в формате, для которого не нужны рекурсивные запросы

А где про такое можно подробнее прочитать?

Это очень древний метод, основанный на http://en.wikipedia.org/wiki/Nested_set_model

http://www.ibase.ru/devinfo/DBMSTrees/sqltrees.html
http://www.sitepoint.com/hierarchical-data-database-2/

Сообщение было отредактировано: 17 фев 15, 14:56
17 фев 15, 14:54    [17276793]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить