Как сделать верхнее рекурсивное самостоятельное объединение в SQL Server? - PullRequest
2 голосов
/ 16 октября 2011

Как я могу сделать рекурсивное самостоятельное соединение в SQL Server?У меня есть такая таблица:

TableID | ParentID
   1    |     NULL
   2    |        1
   3    |        1
   4    |        3
   5    |     NULL
   6    |        4
   7    |        6

Я хочу получить следующие результаты на основе заданного TableID, чтобы получить все ParentsID, связанные с TableID, скажем, я хочу получить всеродители для TableID = 6:

TableID
   6
   4
   3
   1

Я застрял на этом, и я не знаю, как получить результат в SQL-запросе ... Надеюсь рассказать мне SQL-запросчтобы получить предыдущие данные

1 Ответ

5 голосов
/ 16 октября 2011

Это должно быть

; 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

...