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

У меня есть БД 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.

Можно ли одним оператором вставить значения с отношениями между ними?

Ответы [ 2 ]

3 голосов
/ 19 марта 2012
-- 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 голосов
/ 19 марта 2012

Поскольку вы спросили, можете ли вы сделать это в одном утверждении, вот ответ на этот вопрос.Я не могу помочь, но чувствую, что если бы вы дали больше информации, я бы сказал, что то, ради чего вы это делаете, должно решаться по-другому.Мне трудно найти хорошую причину для этого.Вот способ сделать это независимо от этого:

Я предполагаю, что у 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...