В приведенном ниже коде я использую рекурсивное выражение 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, потому что номер идентификатора не связан с его местом в иерархии.