TableB
によって自身に関連するテーブル(TableA
)からのデータセットがあります。 TableA
の親はTableA
の子を持っています。それらの子供には子供もいるかもしれません。ここには素晴らしいものはありません。ストリーミングSQL Server 2008再帰的CTE
私は操作が必要なTableA
の行の最上位セットを持っています。私はそれらの行を操作する前に、各子行を手元に置いておく必要があります。私はTableA
の各最上位行(およびそれの子供)を私のアプリケーションでできるだけ早く操作できる必要があります。
私はこれを行う方法が見つかりません。
再帰的CTE(TableA
アンカーとして最上位セット、TableB->TableA
結合として結合)を使用すると、要件を満たしません。 TableA
の最上位セット全体が、子のレベル2で動作する前にCTEに返されます。次に、レベル3で動作します。次にレベル4などトップレベルのセットが400,000以上の行であるため、クライアントアプリケーションはサーバー上で全データセットがバッチアップされるまで行の作業を開始できません。
これを行うには、より良い方法が必要です。私はクライアントにトップレベルの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
申し訳ありません、* '設計されていません' * - それはどういう意味ですか?現在のソリューションが間違った結果を返すのか、単に効率的でないのか? –