как написать функцию отражения на SQL

#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