0

エレガントな解決策があるかどうか疑問に思っていた問題があります。これは本当のビジネス上の問題であり、クラスの課題ではありません!

何千ものレコードを含むテーブルがあり、そのうちのいくつかは互いに関連するグループです。

データベースは 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 を置き換えました。

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

これで明らかに力ずくで解決できますが、コミュニティにもっとエレガントな答えが見られるかどうか尋ねたいと思います。

4

3 に答える 3

2

それはあなたが必要とする再帰的なCTEです、(未テスト)のようなものです

;WITH myCTE AS
(
    SELECT
       ID
    FROM
       myTable
    WHERE
       REP_ID IS NULL
    UNION ALL
    SELECT
       ID
    FROM
       myTable T
       JOIN
       myCTE C ON T.REP_ID = C.ID
)
SELECT
    *
FROM
    myCTE

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

  • では、C->B またはその両方が必要ですか?
  • ランキング欲しい?
  • 等?
于 2009-10-16T15:07:26.650 に答える
-1

おそらくすでに検討されていると思いますが、単に「original_id」を格納する行を追加することを検討したことがありますか? これにより、誰が誰から継承したかのツリーを構築する場合と比較して、クエリが非常に高速になります。

それがなければ、「SQL ツリー DFS」をググってください。

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

于 2009-10-16T14:56:35.580 に答える