0

次のようなテーブルがあります。

Create Table Entries
(
    EntryID int,
    ParentEntryID int, // -1 if root node
    EntryText nvarchar(100)
)

リーフ EntryIDを取り、そのリーフ エントリから始まるルート エントリを介してすべてのエントリを返すストアド プロシージャを作成する必要があります。それを行う最良の方法は何ですか?

目的のストアド プロシージャは次のようになります。

CREATE PROCEDURE dbo.GetPath
    @leafEntryID int
AS     
    // what to do...
GO

私はそれを検索し、2つの方法を見つけました:

  1. 一時テーブルを使用し、基本的にforループを使用して新しい行を挿入します。(正確にどのように実装するかはわかりません。)
  2. カーソルの使用。(私はこの方法についてあまり考えていません、それはより良いアプローチですか?)

PS: Microsoft SQL Server 2008 を使用しています

4

2 に答える 2

2

使用しているモデルは隣接リストと呼ばれ、処理には再帰クエリが必要です。

および他のいくつかのエンジンではSQL Server、これは、いわゆる再帰 CTE (共通テーブル式) を使用して実現できます。

WITH    q AS
        (
        SELECT  *
        FROM    entries
        WHERE   entryId = @leafEntryId
        UNION ALL
        SELECT  e.*
        FROM    q
        JOIN    entries e
        ON      e.entryId = q.parentEntryId
        )
SELECT  *
FROM    q
于 2013-04-16T11:09:35.273 に答える
1

StackOverflow Wikiで階層データを格納するさまざまなアプローチについて読むことができます 。また、この MS SQL データ型hierarchyIdを参照することをお勧めします

もちろん、MS SQL の隣接リスト モデルでは、Quassnoiのために記述された再帰 CTE を使用する必要があります。

于 2013-04-16T11:19:48.673 に答える