#sql #sql-server #tsql
#sql #sql-сервер #tsql
Вопрос:
у меня есть таблица
Id PId code
12 10 abca
13 12 wwr
14 13 sdf
15 14 aba
16 15 wqe
мне нужно заменить PID на родительский идентификатор, например
Id PId code
12 10 abca
13 12 wwr
14 12 sdf
15 12 aba
16 12 wqe
это моя основная потребность заменить все дочерние PId
, я думаю, нам нужно написать рекурсивную функцию и заменить
im с помощью sql server 2008 rs, скажите мне лучший способ, как я могу этого добиться
Комментарии:
1. Итак, вы хотите заменить any
PId
на12
вместоnull
one (id = 12)?2. Каковы отношения между родительским и дочерним.
3. Удаленный
plsql
тег, поскольку он, похоже, предназначен только для SQL Server (без упоминания Oracle)
Ответ №1:
Насколько я понимаю, теперь у вас есть иерархия со ссылкой сверху через дочерние элементы снизу, и вы хотите изменить ее так, чтобы каждый дочерний элемент в иерархии указывал на самого верхнего родителя.
Альтернатива, которая мне не нравится: курсор цикл времени, чтобы найти самую верхнюю запись для каждой строки
Как бы я это сделал: (не проверял, могут быть некоторые ошибки, записано из головы)
with RecursiveCTE as (
select ID as TopID,
ID as ID
from Table where PId is null
union all
select TopID,
ID
from Table
join RecursiveCTE on RecursiveCTE.ID = Table.PId
)
update Table
set PId = TopID
from Table
join RecursiveCTE
on RecursiveCTE.ID = Table.ID
where Table.PId is not null
Ответ на комментарий: Теперь это зависит от того, ЧТО именно вы пытаетесь сделать. В случае отсутствия нулевого регистра … означает ли это, что существует цикл? (очень плохо и непросто сделать, нужно проверить) Или вы знаете начальное значение? В этом случае все, что вам нужно сделать, это изменить
from Table where PId is null
Для
from Table where PId = 10
и изменить
where Table.PId <> TopID
Для
where Table.PId is not null
Комментарии:
1. спасибо за ответ, не могли бы вы, пожалуйста, рассмотреть мой вопрос еще раз, пожалуйста… если нет нулевых случаев, как мне нужно с этим справиться ..TIA