Domanda

Forse un titolo sopra elaborato. Fondamentalmente pensare a una casella di posta elettronica. Ho una tabella come:

alt text

Come si può vedere, si tratta di una tabella ricorsiva, molto semplice, basta ha il parentID di un messaggio, e come si può vedere con l'anello di evidenziazione verde, alla fine della "catena" è quando c'è un NULL per il parentID.

Che cosa ho bisogno è quello di fornire (per esempio) l'INBOXID di 12, e tornare tutti i genitori .. in questo esempio dovrei ottenere 1 registro posteriore che è INBOXID di 11.
Nel secondo esempio, dovrebbe essere in grado di passare in INBOXID 9, ma questa volta devo tornare righe INBOXID 8,7 e 1

Ho avuto un certo successo con la seguente query:

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

.. ma ovviamente restituisce tutti i genitori per una delle righe .. So che è probabilmente qualcosa di veramente stupidamente semplice come una clausola WHERE su uno dei seleziona .. ma dopo aver provato (cioè parametrizzare il passando del punto di partenza inboxid), non riesco a vedere che cosa devo fare ???

Qualsiasi aiuto molto apprezzato !!!!! David.

È stato utile?

Soluzione

Prova con questo:

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
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top