Рекурсивный запрос SQL 2008 для потоков сообщений с заданной точкой входа в одно сообщение - PullRequest
2 голосов
/ 19 декабря 2010

Может быть, слишком сложное название.В основном подумайте о почтовом ящике.У меня есть таблица так:

alt text

Как вы можете видеть, это рекурсивная таблица, очень простая, просто с parentID сообщения, и, как вы можете видеть с помощьюзеленое кольцо выделения, конец «цепочки» - это когда NULL для parentID.

Мне нужно предоставить (например) INBOXID 12 и вернуть обратно всех родителей.в этом примере я должен получить обратно 1 запись с INBOXID, равным 11.
Во втором примере я должен быть в состоянии передать INBOXID, равный 9, но на этот раз я должен вернуть строки INBOXID 8,7 и 1

У меня был некоторый успех со следующим запросом:

with q as
(
select inboxid, parentid
from bizzbox
union all
select a.inboxid, a.parentid
from bizzbox a
inner join q on q.inboxID = a.parentID
)
select distinct * from q

.. но, конечно, он возвращает всех родителей для любой из строк ... Я знаю, что это, вероятно, что-то действительно глупо простоекак предложение where для одного из операторов select, но, попробовав его (т. е. для параметризации передачи inboxid начальной точки), я не могу понять, что мне нужно делать ???

Anyпомощь очень ценится !!!!!Дэвид.

1 Ответ

1 голос
/ 19 декабря 2010

Попробуйте с этим:

WITH  cte
    AS ( SELECT   InboxID,
                  ParentID
         FROM     BIZZBOX
         WHERE    InboxID = @inboxID
         UNION ALL
         SELECT   prev.InboxID,
                  prev.ParentID
         FROM     BIZZBOX prev
         INNER JOIN cte curr ON prev.InboxID = curr.ParentID ),
     cte1
   AS ( SELECT   InboxID,
                 ParentID
        FROM     BIZZBOX
        WHERE    InboxID = @inboxID
        UNION ALL
        SELECT   prev.InboxID,
                 prev.ParentID
        FROM     BIZZBOX prev
        INNER JOIN cte1 curr ON prev.ParentID = curr.InboxID )
SELECT  * FROM    cte
UNION
SELECT  * FROM    cte1
...