0

在不使用游标的情况下,我试图提出可以完成以下任务的 T-SQL 代码:

在下表中,

SourceData

有两列,[ColA]并且[ColB],两者都是nvarchar(255),具有以下示例数据:

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

ETC。,

将行数据提取到两个表中,

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 回答