У меня есть следующий рекурсивная таблица-функции в MS SQL, для того, чтобы восстановить иерархию объектов из базы данных:Состояния в рекурсивном запросе
WITH tmpField (ParentNum, ChildNum, FieldNum, FieldDescr, Iteration) AS
(
SELECT Field.ParentNum, Field.ChildNum, Field.FieldNum, Field.FieldDescr, 1
FROM Field
WHERE Field.ParentNum = @ParentNum
UNION ALL
SELECT Field.ParentNum, Field.ChildNum, Field.FieldNum, Field.FieldDescr, tmpField.Iteration + 1
FROM Field INNER JOIN
tmpField on Field.ParentNum = tmpField.ChildNum
)
SELECT DISTINCT ParentNum AS ParentNum, ChildNum AS ChildNum, FieldNum, FieldDescr
FROM tmpField
Я хочу изменить его следующим образом:
в последней итерации, когда больше нет «дети», я хочу, чтобы ChildNum
поле, чтобы иметь значение FieldNum
. Во всех предыдущих итерациях ChildNum
должно иметь значение поля ChildNum
, как сейчас.
Может ли кто-нибудь предложить метод для достижения этого, используя вышеуказанный запрос в качестве отправной точки?
Обратите внимание: несмотря на свое имя, поле ChildNum
не ссылается ни на какие дети из строки, но должно интерпретироваться как идентификатор этой строки.
Нет, к сожалению, , ChildNum не является нулевым в этом случае. Вы должны прочитать ChildNum как идентификатор текущей строки, а не как ссылку на другую строку. Именование неловко, я знаю, но это из-за моего контроля, к сожалению :) – Daan
Ваше редактирование выглядит как хороший способ выполнить это. К сожалению, при попытке изменить мою функцию он теперь дает следующую ошибку: функции GROUP BY, HAVING или aggregate не разрешены в рекурсивной части рекурсивного общего выражения таблицы «tmpField». Любые предложения об обходном пути? – Daan
Вместо случая, когда (SELECT COUNT (1) ...) = 0 ТОГДА FieldNum ELSE ChildNum END следует использовать СЛУЧАЙ КОГДА EXIST (Select * из ...) ТОГДА ChildNum ELSE FieldNum END Второй работает быстрее – Niikola