私はこのテーブルを持っています:
Categories( CatId, Name, ParentId NULL )
...これは再帰的であるため、各カテゴリは親カテゴリに名前を付けることができ、親カテゴリには親があります。そのようです:
1, "Sports", NULL
2, "Football", 1
3, "Golf", 1
4, "Handegg", 2
5, "Sex", NULL
6, "On the beach", 5
少し前に、CTEを使用して、次のようにカテゴリの親に対して再帰的なルックアップを実行しました。
WITH Categories(CatId, Name, ParentId, n) AS (
SELECT CatId, Name, ParentId, 1
FROM Categories
WHERE CatId = @categoryId
UNION ALL
SELECT c1.CatId, c1.Name, c1.ParentId, c2.n + 1
FROM Categories AS c1
INNER JOIN Categories AS c2 ON c1.CatId = c2.ParentId
)
しかし、私は考えていました、それをWHILEクエリとして言い換えることはできませんか?
DECLARE @ret TABLE( CatId, Name, ParentId )
DECLARE @tCatId int
DECLARE @tName nvarchar(255)
DECLARE @tParentId int NULL
SELECT @tCatId = CatId, @tName = Name, @tParentId = ParentId
FROM Categories
WHERE CatId = @categoryId
WHILE( @tParentId IS NOT NULL ) BEGIN
INSERT INTO @ret ( CatId, Name, ParentId ) VALUES ( @tCatId, @tName, @tParentId )
SELECT @tCatId = CatId, @tName = Name, @tParentId = ParentId
FROM Categories
WHERE CatId = @tParentId
END
SELECT @ret
明らかに、それは端が少し荒く(最初の行のParentIdがNULLのときに完了しないなど)、テストできませんでした(SQL Serverが再構築のためにダウンしているため)が、確かに同じように正しいです?