В приведенном ниже коде я использую рекурсивное CTE (Common Table Expression) в SQL Server 2005, чтобы попытаться найти родительский элемент верхнего уровня базовой иерархической структуры. Правило этой иерархии состоит в том, что у каждого 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. Я не могу заказать по ParentID или CustID, потому что идентификационный номер не связан с тем, где он находится в иерархии.