Суть этого в том, чтобы
- выбрать все записи, которые происходят из категории 1
- , исключить их из окончательного результата
SQL-оператор
;WITH q AS (
SELECT CategoryID, ParentID
FROM Category
WHERE CategoryID =1
UNION ALL
SELECT c.CategoryID, c.ParentID
FROM Category c
INNER JOIN q ON q.CategoryID = c.ParentID
)
SELECT *
FROM Category c
WHERE NOT EXISTS (SELECT CategoryID FROM q WHERE q.CategoryID = c.CategoryID)
Данные испытаний
;WITH Category (CategoryID, ParentID, CategoryName) AS (
SELECT 1, 0, 'A'
UNION ALL SELECT 2, 1, 'B'
UNION ALL SELECT 3, 1, 'C'
UNION ALL SELECT 4, 2, 'D'
UNION ALL SELECT 5, 0, 'E'
UNION ALL SELECT 6, 5, 'F'
UNION ALL SELECT 7, 5, 'G'
UNION ALL SELECT 8, 6, 'I'
UNION ALL SELECT 9, 1, 'J'
UNION ALL SELECT 10, 0, 'L'
)
, q AS (
SELECT CategoryID, ParentID
FROM Category
WHERE CategoryID =1
UNION ALL
SELECT c.CategoryID, c.ParentID
FROM Category c
INNER JOIN q ON q.CategoryID = c.ParentID
)
SELECT *
FROM Category c
WHERE NOT EXISTS (SELECT CategoryID FROM q WHERE q.CategoryID = c.CategoryID)