Sql 使用增量的不同表中的信息更新表

Sql 使用增量的不同表中的信息更新表,sql,sql-server,sql-update,inner-join,common-table-expression,Sql,Sql Server,Sql Update,Inner Join,Common Table Expression,我想用parentId=parentId的表1中的任何ID更新表2 但仅限于表1中的金额 因此,如果表1中有parentId为1的5条记录,则只更新parentId为1的表2 5条记录 表1: id NAME ParentId ----------- -------------------------------------------------- ----------- 1

我想用parentId=parentId的表1中的任何ID更新表2

但仅限于表1中的金额

因此,如果表1中有parentId为1的5条记录,则只更新parentId为1的表2 5条记录

表1:

id          NAME                                               ParentId
----------- -------------------------------------------------- -----------
1           Name1                                              1
2           Name2                                              1
3           Name3                                              1
4           Name4                                              1
5           Name5                                              1
表2:

Id          name                                               Table1Id    ParentId
----------- -------------------------------------------------- ----------- -----------
7           Name7                                              NULL        1
8           Name8                                              NULL        1
9           Name9                                              NULL        1
10          Name10                                             NULL        1
11          Name11                                             NULL        1
12          Name12                                             NULL        1
13          Name13                                             NULL        1
14          Name14                                             NULL        1
我需要什么

Id          name                                               Table1Id    ParentId
----------- -------------------------------------------------- ----------- -----------
7           Name7                                              1           1
8           Name8                                              2           1
9           Name9                                              3           1
10          Name10                                             4           1
11          Name11                                             5           1
12          Name12                                             NULL        1
13          Name13                                             NULL        1
14          Name14                                             NULL        1

我尝试为每个函数获取一个rownum,并在此基础上进行join,但出现了错误窗口函数只能出现在SELECT或ORDER BY子句中。Hmmm。您需要为加入它们生成密钥。使用
行编号()


您需要枚举这两个表中的行,然后更新。我喜欢使用可更新的CTE执行此类任务,在SQL Server中,CTE的灵活性令人惊讶:

with cte as (
    select t2.table1id, t1.id
    from (
        select t1.*, row_number() over (partition by parentid order by id) rn
        from table1 t1
    ) t1
    inner join (
        select t2.*, row_number() over (partition by parentid order by id) rn
        from table2 t2
    ) t2 on t2.parentid = t1.parentid and t2.rn = t1.rn
)
update cte set table1id = id
这种方法的优点是不需要重新打开目标表:每个表只扫描一次,然后进行更新

Id | name | Table1Id | ParentId -: | :----- | -------: | -------: 7 | Name7 | 1 | 1 8 | Name8 | 2 | 1 9 | Name9 | 3 | 1 10 | Name10 | 4 | 1 11 | Name11 | 5 | 1 12 | Name12 | null | 1 13 | Name13 | null | 1 14 | Name14 | null | 1 Id |名称|表1ID |父Id -: | :----- | -------: | -------: 7 |姓名7 | 1 | 1 8 |姓名8 | 2 | 1 9 |姓名9 | 3 | 1 10 |姓名10 | 4 | 1 11 |姓名11 | 5 | 1 12 | name 12 | null | 1 13 |名称13 |空| 1 14 |名称14 |空| 1 Id | name | Table1Id | ParentId -: | :----- | -------: | -------: 7 | Name7 | 1 | 1 8 | Name8 | 2 | 1 9 | Name9 | 3 | 1 10 | Name10 | 4 | 1 11 | Name11 | 5 | 1 12 | Name12 | null | 1 13 | Name13 | null | 1 14 | Name14 | null | 1