Это должно быть
; WITH MyQuery (TableID, ParentID, Level) AS
(
SELECT M.TableID, M.ParentID, 0 AS Level
FROM MyTable M
WHERE M.TableID = 6 -- Here it's the row number where the query starts
UNION ALL
SELECT M.TableID, M.ParentID, Q.Level + 1
FROM MyTable M
INNER JOIN MyQuery Q ON M.TableID = Q.ParentID
)
SELECT * FROM MyQuery;
и, как написано Байерсом, это рекурсивные запросы с использованием общих табличных выражений
Столбец Level
бесполезен (этоне "бесполезно бесполезно". Это бесполезно для того, что вы спросили), я добавил его, потому что он довольно часто вставляется в эти рекурсивные запросы.Если вам это не нужно, удалите его из 3 мест, где оно появляется.
Кажется, намного сложнее сделать Level
в обратном порядке (так что прадедушка - уровень 0,его дети 1 уровня ...)
Обратите внимание, что этот код будет работать с SQL Server> = 2005