我有一組數據來自表(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
對不起,*'沒有設計正確'* - 你是什麼意思?你目前的解決方案是否會返回不正確的結果,或者它們效率不夠? –