2012-03-19 48 views
1

我有一个SQL Server 2008数据库,像这样(表1)表:SQL Server插入第N行引用N - 1行的标识。可能?

ID ParentID Name 
-- -------- --- 
11 NULL  Foo 
12 11   Bar 
13 12   etc 

ID都被定义为IDENTITY

我的值为Foo,Bar,etc作为另一个表(Table2)中的行,我必须将它们插入到Table1中。

插入的值必须位于Table1的父子关系中,第N行的ParentID列指向第N-1行的ID

是否有可能用一条语句插入值与它们之间的关系?

+0

你是什么意思的价值观? – Hogan 2012-03-19 17:58:34

+0

@Hogan:我有另一个表(表2)与行:美孚,酒吧等我想在表1中插入(与插入...选择),但在表1我必须创建ID-ParentId关系为这些值。 – JohnDoDo 2012-03-19 18:00:45

+0

表2中的父子关系逻辑是什么?一个可以由ASC订购,另一个可以在插入时通过DESC订购。 ??? – Kaf 2012-03-19 18:21:29

回答

3
-- 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 
0

既然你问你是否可以在一个声明中做到这一点,这里是一个答案。我不禁感到,如果你提供了更多的信息,我会告诉你无论你这样做是否应该以另一种方式解决。我很难有一个很好的理由来做到这一点。不管如何,这是一种方法:

我假设表1有Id,ParentId和Name,并且Table2有Id和Name我还假设你可以施加一些命令。

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