Sql 使用增量的不同表中的信息更新表
我想用parentId=parentId的表1中的任何ID更新表2 但仅限于表1中的金额 因此,如果表1中有parentId为1的5条记录,则只更新parentId为1的表2 5条记录 表1: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
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