SQL Server insert,第N行引用N-1行的标识。可能的
我有一个SQL Server 2008 DB,其表如下表1所示:SQL Server insert,第N行引用N-1行的标识。可能的,sql,sql-server,sql-server-2008,insert,identity,Sql,Sql Server,Sql Server 2008,Insert,Identity,我有一个SQL Server 2008 DB,其表如下表1所示: ID ParentID Name -- -------- --- 11 NULL Foo 12 11 Bar 13 12 etc ID是用标识声明的 我将值Foo、Bar等作为行放在另一个表Table2中,我必须将它们插入到Table1中 插入的值必须位于表1中的父子关系中,第N行的ParentID列指向第N-1行的ID 是否可以用一条
ID ParentID Name
-- -------- ---
11 NULL Foo
12 11 Bar
13 12 etc
ID是用标识声明的
我将值Foo、Bar等作为行放在另一个表Table2中,我必须将它们插入到Table1中
插入的值必须位于表1中的父子关系中,第N行的ParentID列指向第N-1行的ID
是否可以用一条语句插入值以及它们之间的关系?既然您询问是否可以在一条语句中插入值,下面是一个答案。我忍不住觉得,如果你提供了更多的信息,我会告诉你,无论你做这件事是为了什么,都应该用另一种方式来解决。我很难想出这么做的理由。尽管如此,还是有一种方法可以做到这一点:
-- Insert all names in first table
insert Table1
(Name)
select Name
from Table2
-- For each row in Table1,
-- Search for the matching row in Table2,
-- Then look up the "parent" row in Table2,
-- And back to Table1 for the "parent" id
update t1
set ParentID = t1_parent.ID
from Table1 t1
join Table2 t2
on t1.Name = t2.name
cross apply
(
select top 1 *
from Table2 t2_parent
where t2_parent.ID < t2.ID
order by
t2_parent.ID desc
) t2_parent
join Table1 t1_parent
on t1_parent.Name = t2_parent.Name
我假设表1有Id,ParentId和Name,而表2有Id和Name,你说你从表2中得到了Foo,Bar等名称。我还假设你可以强加一些命令
CREATE TABLE #T
(
Id INT IDENTITY(1, 1)
, ParentId INT
, Name VARCHAR(100)
)
CREATE TABLE #T2
(
Id INT IDENTITY(1, 1)
, Name VARCHAR(100)
)
INSERT #T2
(
Name
)
VALUES ('Foo'), ('Bar')
INSERT #T
(
ParentId
, Name
)
SELECT
NULLIF(IDENT_CURRENT('#T')
+ ROW_NUMBER() OVER(ORDER BY T2.Name)
- 2, (SELECT ISNULL(MIN(Id), 1) - 1 FROM #T))
, T2.Name
FROM #T2 T2
SELECT * FROM #T
DROP TABLE #T
DROP TABLE #T2
你所说的值列表是什么意思?@Hogan:我有另一个表Table2,其中有行:Foo、Bar等。我想在Table1中使用insert…select进行插入,但在Table1中,我必须为这些值创建ID ParentId关系。表2中的paren子关系逻辑是什么?插入时,一个可以通过ASC订购,另一个可以通过DESC订购???