Вставка SQL Server со строкой N, ссылающейся на идентификатор строки N - 1. Возможно?

У меня есть БД SQL Server 2008 с такой таблицей (Таблица 1):

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

ID объявляется с IDENTITY.

У меня есть значения Foo, Bar, etc в виде строк в другой таблице (Table2), и я должен вставить их в Table1.

Вставляемые значения должны находиться в родительском дочернем отношении в таблице 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 (с помощью insert...select), но в 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