Sql CTE递归选择并插入到具有新id和一些更新字段的同一个表中

Sql CTE递归选择并插入到具有新id和一些更新字段的同一个表中,sql,sql-server,recursion,common-table-expression,hierarchy,Sql,Sql Server,Recursion,Common Table Expression,Hierarchy,假设我有这张桌子: |TeamId |Name |ActiveYear |ParentTeamId |OriginTeamId | +-------+---------------+-----------+-------------+-------------+ |1 |Founding Team |2020 |NULL |NULL | |2 |Elders Team |2020 |1

假设我有这张桌子:

|TeamId |Name           |ActiveYear |ParentTeamId |OriginTeamId |
+-------+---------------+-----------+-------------+-------------+
|1      |Founding Team  |2020       |NULL         |NULL         |
|2      |Elders Team    |2020       |1            |NULL         |
|3      |Younger Team   |2020       |1            |NULL         |
|4      |Women Team     |2020       |2            |NULL         |
|5      |Men´s Team     |2020       |2            |NULL         |
当我查询它时,我可以看到层次结构:

WITH abcd AS 
(
    -- anchor
    SELECT 
        CAST((Convert(varchar(20), TeamId)) AS VARCHAR(1000)) AS "Tree",
        TeamId, [Name], Activeyear, ParentTeamId, OriginTeamId
    FROM    
        Teams AS p
    WHERE   
        ParentTeamId IS NULL And ActiveYear = 2020

    UNION ALL

    --recursive member
    SELECT  
        CAST((CONVERT(varchar(20), a.tree) + '/' + CONVERT(varchar(20), c.TeamId)) AS VARCHAR(1000)) AS "Tree",
        c.TeamId, c.[Name], c.Activeyear, c.ParentTeamId, c.OriginTeamId
    FROM
        Teams AS c
    JOIN 
        abcd AS a ON c.ParentTeamId = a.TeamId
    WHERE   
        c.ActiveYear = 2020
) 
SELECT * 
FROM abcd
现在,我需要更新这个表,重新创建相同的结构,但使用新id和Activeyear=2021

因此,新的父记录仍然是其他新记录的父记录

我想做一个查询,它允许我克隆这个数据并插入一些更新:ActiveYear=2021,OriginTeamIDorigInteramid是为了确定这些信息的来源


我该怎么做呢?

一种方法是分两步进行。插入没有ID的行。然后计算出ID:

insert into teams (name, activeyear, parentid)
    select name, 2021, parentid
    from teams
    where actdiveyear = 2020;
现在通过查找相应的ID来更新这些值。窗口功能在这里有帮助:

insert into teams (name, activeyear, ParentTeamId)
    select name, 2021, ParentTeamId
    from teams
    where activeyear = 2020;

with corresponding as (
      select t2020.teamid  as teamid_2020, t2021.teamid as teamid_2021
      from teams t2020 join
           teams t2021
           on t2020.name = t2021.name
      where t2020.activeyear = 2020 and t2021.activeyear = 2021
     )
update t
    set ParentTeamId = c.teamid_2021
    from teams t join
         corresponding c
         on t.ParentTeamId = c.teamid_2020
     where t.activeyear = 2021;

是一个dbfiddle。

一种方法是分两步进行。插入没有ID的行。然后计算出ID:

insert into teams (name, activeyear, parentid)
    select name, 2021, parentid
    from teams
    where actdiveyear = 2020;
现在通过查找相应的ID来更新这些值。窗口功能在这里有帮助:

insert into teams (name, activeyear, ParentTeamId)
    select name, 2021, ParentTeamId
    from teams
    where activeyear = 2020;

with corresponding as (
      select t2020.teamid  as teamid_2020, t2021.teamid as teamid_2021
      from teams t2020 join
           teams t2021
           on t2020.name = t2021.name
      where t2020.activeyear = 2020 and t2021.activeyear = 2021
     )
update t
    set ParentTeamId = c.teamid_2021
    from teams t join
         corresponding c
         on t.ParentTeamId = c.teamid_2020
     where t.activeyear = 2021;

是一把小提琴。

是的!为了更容易地更新ID,我在insert中包含了OriginTeamId,在Select中包含了TeamId。然后在更新中我使用:on t2020.TeamId=t2021.OriginTeamId.Yes!为了更容易地更新ID,我在insert中包含了OriginTeamId,在Select中包含了TeamId。然后在更新中我使用:on t2020.TeamId=t2021.OriginTeamId。