以下のコードでは、SQL Server 2005で再帰的なCTE(共通テーブル式)を使用して、基本的な階層構造の最上位の親を検索しています。この階層のルールでは、すべてのCustIDにParentIDがあり、CustIDに親がない場合はParentID = CustIDであり、最も高いレベルです。再帰CTEで最終レコードをどのように生成しますか?
DECLARE @LookupID int
--Our test value
SET @LookupID = 1
WITH cteLevelOne (ParentID, CustID) AS
(
SELECT a.ParentID, a.CustID
FROM tblCustomer AS a
WHERE a.CustID = @LookupID
UNION ALL
SELECT a.ParentID, a.CustID
FROM tblCustomer AS a
INNER JOIN cteLevelOne AS c ON a.CustID = c.ParentID
WHERE c.CustID <> a.CustomerID
)
tblCustomerは次のようになりますのであれば:
ParentID CustID
5 5
1 8
5 4
4 1
私は上記のコードから得る結果は次のとおりです。私が欲しいもの
ParentID CustID
4 1
5 4
5 5
は、その結果のちょうど最後の行です。
ParentID CustID
5 5
どのようにd o CTEで生成された最後のレコードを返します(最高レベルのCustIDになります)。
また、このテーブルには無関係な複数のCustID階層が存在するため、SELECT * FROM tblCustomer WHERE ParentID = CustIDだけではできません。 ID番号が階層内のどこに関連していないので、ParentIDまたはCustIDで注文することはできません。