0


1

に優雅な解決策があるかどうか私は思っていた問題を抱えています。 これは実際のビジネス上の問題であり、クラスの割り当てではありません。

私は何千ものレコードを持つテーブルを持っています。それらのいくつかは互いに関連したグループです。

データベースはSQL 2005です。

IDが主キーです。 レコードが以前のレコードを置き換えた場合、そのレコードのIDはREP_ID列にあります。

ID REP_ID

E D D B C B B A A NULL

したがって、この例では、Aが元の行、BがAを置き換え、CがBを置き換えて失敗し、DがBを置き換え、最後にEがDを置き換えました。

このテーブルのすべてのレコードをグリッドに表示できるようにしたいです。 次に、ユーザーが任意のグループ内の任意のレコードを右クリックし、システムがすべての関連レコードを見つけてそれらをある種のツリーに表示できるようにします。

今、私は明らかにこれに対する解決策を強要することができますが、私は彼らがよりエレガントな答えを見ることができるかどうかコミュニティに尋ねたいのですが。

3 Answer


2


それはあなたが必要とする 再帰的CTEです。

; myCTE AS(myTableからのSELECT ID、REP_IDはNULLです。myTableからのすべてのSELECT ID T T.REP_ID = C.IDに結合)SELECT * from myCTE

ただし、リンクC→BおよびD→B

  • それで、あなたはC→ Bまたは両方が欲しいですか?

  • あなたはランキングが欲しいですか?

  • 等?


0


http://msdn.microsoft.com/ja-jp/library/ms190766.aspx[*CTE*]を使用して階層を構築してください。 何かのようなもの
CREATE TABLE #test(ID CHAR(1)、REP_ID CHAR(1)NULL)

#testの値を挿入( 'E'、 'D')#testの値を挿入(#D、 'B') '、' A ')#test VALUESに挿入(' A '、NULL)

WITH tree(ID、REP_ID、深さ)AS(SELECT ID、REP_ID、1 AS [深さ] FROM #test WHERE REP_IDがNULLの場合

UNION ALL

SELECT [テスト] .ID、[テスト] .REP ID、ツリー[深さ] 1 AS [深さ] FROM #test [テスト] INNER JOIN tree ON [テスト] .REP ID = tree.ID)

SELECT * FROMツリー


-1


あなたはおそらくそれをすでに考えていましたが、あなたは単に "original_id"を格納するために行を追加することを検討しましたか? 誰から継承したのかのツリーを構築するのに比べて、クエリが速くなります。

それを除けば、単に「SQLツリーDFS」のためにグーグル。

次のようにDFSを最適化するようにしてください。ほとんどのレコードのリビジョンが3以下であることがわかっている場合は、3者間ジョイントから始めてすぐにA、B、Cを見つけることができます。