Вмъкване на SQL Server с ред N, препращащ към идентичността на реда N - 1. Възможен?

Имам SQL Server 2008 DB с таблица като тази (Таблица1):

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

ID се декларира с IDENTITY.

Имам стойностите Foo, Bar, etc като редове в друга таблица (Таблица2) и трябва да ги вмъкна в Таблица1.

Вмъкнатите стойности трябва да са в релация родител дете в Таблица1, като ParentID колона от ред N сочи към ID на ред N-1.

Възможно ли е с един оператор да се вмъкнат стойностите с отношенията между тях?


person JohnDoDo    schedule 19.03.2012    source източник
comment
Какво имате предвид под списък със стойности?   -  person Hogan    schedule 19.03.2012
comment
@Hogan: Имам друга таблица (Table2) с редовете: Foo, Bar и т.н. Искам да направя вмъкване в Table1 (с вмъкване...избор), но в Table1 трябва да създам отношенията ID-ParentId за тези стойности.   -  person JohnDoDo    schedule 19.03.2012
comment
Каква е логиката на връзката родител дете в таблица 2? Един може да поръча по ASC, а друг по DESC при вмъкване. ???   -  person Kaf    schedule 19.03.2012


Отговори (1)


Тъй като попитахте дали можете да направите това в едно твърдение, ето отговор за това. Не мога да не почувствам, че ако бяхте дали повече информация, щях да ви кажа, че каквото и да правите това, трябва да се реши по друг начин. Трудно ми е да измисля добра причина да направя това. Ето начин да го направите независимо от това:

Предполагам, че Table1 има Id, ParentId и Name, а Table2 има Id и Name (ти каза, че си получил имената Foo, Bar, независимо от Table2). Предполагам също, че има някакъв ред, който можете да наложите.

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
person Jeremy Pridemore    schedule 19.03.2012