以下のコードでは、SQL Server 2005 で再帰的な CTE (Common Table Expression) を使用して、基本的な階層構造の最上位レベルの親を見つけようとしています。この階層のルールは、すべての CustID に ParentID があり、CustID に親がない場合、ParentID = CustID であり、それが最上位レベルです。
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
CTE で生成された最後のレコード (最高レベルの CustID) を返すにはどうすればよいですか?
また、このテーブルには関連のない CustID 階層が複数あるため、単に SELECT * FROM tblCustomer WHERE ParentID = CustID を実行することはできません。ID 番号は階層のどこにあるかに関連していないため、ParentID または CustID で注文することはできません。