0

カーソルを使用せずに、次のことを実現するT-SQLコードを考え出そうとしています。

次の表では、

SourceData

これには2つの列が[ColA]あり[ColB]、両方ともnvarchar(255)、次のデータ例があります。

ColA    |  ColB
==================
AAA     |  TripleA
TripleA |  AAA
AAA     |  ThreeAs
ThreeAs |  AAA
BBB     |  TripleB
TripleB |  BBB
BBB     |  ThreeBs
ThreeBs |  BBB

等。、

行データを2つのテーブルに抽出します。

TableA_Root、 とTableB_Children

TableA_Rootこれらの列はどこにありますか:[ROID identity], [Root]

次の列がありTableB_Childrenます。[COID identity],[fKey_ROID],[Child]

結果のテーブルに次のようなサンプルデータが含まれるようにします。

TableA_Root
==============
1  |  AAA
2  |  BBB

TableB_Children
===============
1 | 1 | TripleA
2 | 1 | ThreeAs
3 | 2 | TripleB
4 | 2 | ThreeBs

最初はカーソルを使うと思いました。しかし、それは最適なアプローチではないと確信しています。明らかに、これはソートとマージであり、SQLの外部で実行できます。「IN」または「EXISTS」を使用してサブクエリで試したアイデアの一部ですが、私の試みは不十分です。新鮮な視点を使うことができました。

4

1 に答える 1

2

SourceDataに同じ行の複製を持つことができない主キーがあると仮定すると、これはあなたが望むものを得るでしょう...

With    cte1 As
(
        Select  Row_Number() Over (Order By ph) As ph, 
                ColA, 
                ColB
        From   (Select  1 As ph, 
                        ColA,
                        ColB
                From    SourceData) As n
)
Insert  TableA_Root (ROID, Root)
Select  Row_Number() Over (Order By c.ph) As ROID,
        ColA
From    cte1 c
Where   Not Exists (Select  1
                    From    cte1 c2
                    Where   c.ColA = c2.ColB
                    And     c.ph > c2.ph);

Insert  TableB_Children (COID, ROID, Child)
Select  Row_Number() Over (Order By ta.ROID), 
        ta.ROID, 
        tb.Colb
From    TableA_Root ta
Join    SourceData tb
        On  ta.Root = tb.ColA;
于 2013-02-07T22:44:14.523 に答える