Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
SQL Server insert,第N行引用N-1行的标识。可能的_Sql_Sql Server_Sql Server 2008_Insert_Identity - Fatal编程技术网

SQL Server insert,第N行引用N-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 是否可以用一条

我有一个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


是否可以用一条语句插入值以及它们之间的关系?

既然您询问是否可以在一条语句中插入值,下面是一个答案。我忍不住觉得,如果你提供了更多的信息,我会告诉你,无论你做这件事是为了什么,都应该用另一种方式来解决。我很难想出这么做的理由。尽管如此,还是有一种方法可以做到这一点:

-- 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订购???