2012-03-19 15 views
1

私はこのようなテーブル(表1)とSQL Server 2008のDBを持っている:N - 1行のIDを参照する行NのSQL Server挿入。可能?

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

IDをIDENTITYで宣言されています。

私は値Foo,Bar,etcを別の表(表2)に行として表1に挿入する必要があります。

挿入された値は、Table1の親子関係にあり、N行目のIDを指すParentID列がN-1行目を指している必要があります。

1つのステートメントで値を挿入することは可能ですか?

+0

値リストはどういう意味ですか? – Hogan

+0

@Hogan:Foo、Barなどの行を持つ別のテーブル(Table2)があります。(Insert ... selectを使用して)Table1に挿入したいのですが、Table1ではID-ParentIdリレーションを作成する必要がありますこれらの値。 – JohnDoDo

+0

表2のparen子関係ロジックとは何ですか? ASCで注文し、別の注文をDESCで注文することができます。 ??? – Kaf

答えて

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つのステートメントでこれを実行できるかどうか尋ねられたので、ここでその答えを示します。私は助けることはできませんが、あなたがもっと多くの情報を与えたなら、あなたがこれをやっていることは、別の方法で解決すべきだと私は言っているでしょう。私はこれを行うための正当な理由を思い付くのに苦労している。これには関係なく、それを行う方法があります:

私はTable1がId、ParentId、およびNameを持っていると仮定し、そのTable2にはIdとNameがあります(あなたはTable2から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 
関連する問題