Выберите все категории, кроме их дочерних категорий - PullRequest
2 голосов
/ 04 августа 2011

У меня есть таблица Категория с отношениями Родитель и Дочерний, моя схема таблицы ниже:

CategoryID       ParentID        CategoryName
1                  0                A
2                  1                B
3                  1                C
4                  2                D
5                  0                E
6                  5                F
7                  5                G
8                  6                I
9                  1                J
10                 0                L

Теперь, когда я хочу выбрать все категории, которые не имели ParentId 1 иэто Child CategoryID , мой вывод должен выглядеть следующим образом, когда я передаю CategoryID 1

CategoryID        ParentID        CategoryName
5                   0                  E
6                   5                  F
7                   5                  G
8                   6                  H
10                  0                  L

как я могу найти результаты, выглядящие так.

1 Ответ

1 голос
/ 04 августа 2011

Суть этого в том, чтобы

  1. выбрать все записи, которые происходят из категории 1
  2. , исключить их из окончательного результата

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...