gpt4 book ai didi

sql-server-2008 - T-SQL : CTE with identity columns

转载 作者:行者123 更新时间:2023-12-04 07:08:03 25 4
gpt4 key购买 nike

我正在构建一棵树( Material list 样式),并转换一些数据。考虑下表:

Material list

  • 用户名
  • 父级

现在我正在使用 CTE 来填充它:

with BOM as 
(
select @@identity as BomId, null as ParentId <some other fields> from MyTable
union all
select @@identity as BomId,
parent.BomId as ParentId,
some other fields
from MyTable2
inner join BOM parent on blabla)

insert into MyTable3
select * from BOM

问题是:@@identity 只会给我并集之前插入的最后一条记录的标识。

我该怎么做才能获得身份?我可以修改 Table3 但不能修改 Table1 或 Table2

row_number() 对于递归查询有未定义的行为,所以我不能在这里使用它。

我知道我可以使用 GUID,这是唯一的选择吗?

最佳答案

您无法在 CTE 中捕获生成的身份。但是,您可以使用 null 作为 ParentID 将所有行插入到目标表中,然后在单独的更新语句中更新 ParentID。为此,您可以使用 merge 和描述的技术 here .

-- Helper table to map new id's from source
-- against newly created id's in target
declare @IDs table
(
TargetID int,
SourceID int,
SourceParentID int
)

-- Use merge to capture generated id's
merge BillOfMaterials as T
using SourceTable as S
on 1 = 0
when not matched then
insert (SomeColumn) values(SomeColumn)
output inserted.BomId, S.BomID, S.ParentID into @IDs;

-- Update the parent id with the new id
update T
set ParentID = I2.TargetID
from BillOfMaterials as T
inner join @IDs as I1
on T.BomID = I1.TargetID
inner join @IDs as I2
on I1.SourceParentID = I2.SourceID

这是关于 SE-Data 的完整工作示例

关于sql-server-2008 - T-SQL : CTE with identity columns,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10278737/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com