2

CTE、またはあるテーブルから階層データを取得し、別のインデックスを持つ可能性のある別のテーブルに挿入するクエリを作成しようとしています。これは簡単だと思っていましたが、何らかの理由で行き詰まっています。新しくシードされたインデックスを使用して、「RequiredID」で出力を正しく読み取ることができません。ところで、私は SQL Server 2012 で作業しています。

以下に、私が何をしようとしているのかを示すために、概念実証コードを提供しました。実際の SQL はもっと複雑ですが、これは要点を示しています。

これは私がこれまでに得たものです:

DECLARE @Table TABLE (ID INT, Code NVARCHAR(50), RequiredID INT);

INSERT INTO @Table (ID, Code, RequiredID)   VALUES
    (1, 'Physics', NULL),
    (2, 'Advanced Physics', 1),
    (3, 'Nuke', 2),
    (4, 'Health', NULL);    

DECLARE @DefaultSeed TABLE (ID INT, Code NVARCHAR(50), RequiredID INT);

WITH hierarchy 
AS (
    --anchor
    SELECT  t.ID , t.Code , t.RequiredID
    FROM @Table AS t
    WHERE t.RequiredID IS NULL

    UNION ALL   

    --recursive
    SELECT  t.ID 
          , t.Code 
          , h.ID        
    FROM hierarchy AS h
        JOIN @Table AS t 
            ON t.RequiredID = h.ID
    )

INSERT INTO @DefaultSeed (ID, Code, RequiredID)
SELECT  ID 
        , Code 
        , RequiredID
FROM hierarchy
OPTION (MAXRECURSION 10)


DECLARE @NewSeed TABLE (ID INT IDENTITY(10, 1), Code NVARCHAR(50), RequiredID INT)

--this is where I get stuck - I can't get the requiredID to read like below
INSERT INTO @NewSeed (Code, RequiredID)
SELECT  Code, RequiredID 
FROM @DefaultSeed

--I'm trying to get @NewSeed should read like the following...
[ID]  [Code]           [RequiredID]
10....Physics..........NULL
11....Health...........NULL
12....AdvancedPhysics..10
13....Nuke.............12


SELECT *
FROM @NewSeed

どんな助けでも大歓迎です!

4

1 に答える 1

2

OUTPUTをMergeと組み合わせて使用​​して、ID から新しい ID へのマッピングを取得できます。

重要な部分:

--this is where you got stuck
Declare @MapIds Table (aOldID int,aNewID int)

;MERGE INTO @NewSeed AS TargetTable
Using @DefaultSeed as Source on 1=0
WHEN NOT MATCHED then
 Insert (Code,RequiredID)
 Values
 (Source.Code,Source.RequiredID)
OUTPUT Source.ID ,inserted.ID into @MapIds;


Update @NewSeed Set RequiredID=aNewID
from @MapIds
Where RequiredID=aOldID

そして全体の例:

DECLARE @Table TABLE (ID INT, Code NVARCHAR(50), RequiredID INT);

INSERT INTO @Table (ID, Code, RequiredID)   VALUES
    (1, 'Physics', NULL),
    (2, 'Advanced Physics', 1),
    (3, 'Nuke', 2),
    (4, 'Health', NULL);    

DECLARE @DefaultSeed TABLE (ID INT, Code NVARCHAR(50), RequiredID INT);

WITH hierarchy 
AS (
    --anchor
    SELECT  t.ID , t.Code , t.RequiredID
    FROM @Table AS t
    WHERE t.RequiredID IS NULL

    UNION ALL   

    --recursive
    SELECT  t.ID 
          , t.Code 
          , h.ID        
    FROM hierarchy AS h
        JOIN @Table AS t 
            ON t.RequiredID = h.ID
    )

INSERT INTO @DefaultSeed (ID, Code, RequiredID)
SELECT  ID 
        , Code 
        , RequiredID
FROM hierarchy
OPTION (MAXRECURSION 10)


DECLARE @NewSeed TABLE (ID INT IDENTITY(10, 1), Code NVARCHAR(50), RequiredID INT)

Declare @MapIds Table (aOldID int,aNewID int)

;MERGE INTO @NewSeed AS TargetTable
Using @DefaultSeed as Source on 1=0
WHEN NOT MATCHED then
 Insert (Code,RequiredID)
 Values
 (Source.Code,Source.RequiredID)
OUTPUT Source.ID ,inserted.ID into @MapIds;


Update @NewSeed Set RequiredID=aNewID
from @MapIds
Where RequiredID=aOldID


/*
--@NewSeed should read like the following...
[ID]  [Code]           [RequiredID]
10....Physics..........NULL
11....Health...........NULL
12....AdvancedPhysics..10
13....Nuke.............12
*/

SELECT *
FROM @NewSeed
于 2013-09-19T05:53:03.670 に答える