我有一组数据来自表(TableA
),它通过TableB
与自身相关。 TableA
的家长在TableA
有孩子。这些孩子也可能有孩子。这里什么都不好。Streaming SQL Server 2008递归CTE
我有一个从TableA
我需要操作的顶层集合的行。在我可以操作这些行之前,我必须让每个孩子都行。我必须能够在我的应用程序中尽可能快地在TableA
(以及它的子项)的每个顶级行上操作。
我找不到办法做到这一点。
使用递归CTE(TableA
顶级设置为锚点,TableB->TableA
连接为联合)不符合要求。来自TableA
的整个顶层集合在CTE中返回,然后在子级的第2层上工作。然后它在3级上工作,然后是4级等等。由于我的顶级集合有400,000多行,因此我的客户端应用程序无法开始处理行,直到ENTIRE数据集在服务器上成批完成。
我需要一个更好的方式来做到这一点。我尝试将一组顶级的TableA
行数据流传输到客户端,并让客户端为每个顶级TableA
行重复发出递归CTE语句。这实际上起作用。但是噪音太大了。由于重复发表声明,持续的行检索率太大。
我需要一个创造性的解决方案。
我正在使用的每条记录CTE的片段。在这个例子中,TableA是Member,TableB是MemberReplacement。我剔除了大部分中间的select语句以及大部分连接。
WITH T_MemberRecurse
(
MemberId,
IncludedMemberId,
Level
) AS (
SELECT Member.Id,
Member.Id,
0
FROM MemberInput
INNER JOIN MemberInputItem
ON MemberInputItem.MemberInputId = MemberInput.Id
INNER JOIN Member
ON Member.Id = MemberInputItem.MemberId
UNION ALL
SELECT T_MemberRecurse.MemberId,
Member2.Id,
Level + 1
FROM T_MemberRecurse
INNER JOIN Member
ON Member.Id = T_MemberRecurse.IncludedMemberId
INNER JOIN MemberReplacement
ON MemberReplacement.MemberId = Member.Id
INNER JOIN Member Member2
ON Member2.Id = MemberReplacement.OriginalMemberId
)
SELECT Member.Id,
T_MemberRecurse.IncludedMemberId,
T_MemberRecurse.Level,
FROM MemberInput
INNER JOIN LotsOfTables
你能张贴一些样本代码和样本数据吗? – JNK
刚做过。我添加了每个记录的CTE示例。发布示例的一个问题是,我的例子甚至都没有被设计出来解决问题的权利。 – wasabi
对不起,*'没有设计正确'* - 你是什么意思?你目前的解决方案是否会返回不正确的结果,或者它们效率不够? –