Domanda

Data una tabella semplice (id, descrizione) t1, come

id  description
--  -----------
1   Alice
2   Bob
3   Carol
4   David
5   Erica
6   Fred

E una tabella di relazioni padre-figlio t2, come

parent  child
------  -----
1       2
1       3
4       5
5       6

Oracle offre un modo per attraversarlo come un albero con alcune estensioni di sintassi personalizzate:

select parent, child, sys_connect_by_path(child, '/') as "path"
from t2
connect by prior parent = child

La sintassi esatta non è importante e probabilmente ho commesso un errore in quanto sopra. Il cosa importante è che quanto sopra produrrà qualcosa che assomiglia

parent  child  path
------  -----  ----
1       2      /1/2
1       3      /1/3
4       5      /4/5
4       6      /4/5/6
5       6      /5/6

La mia domanda è questa: è possibile unire un'altra tabella all'interno di sys_connect_by_path (), come la tabella t1 sopra, per produrre qualcosa del tipo:

parent  child  path
------  -----  ----
1       2      /Alice/Bob
1       3      /Alice/Carol
... and so on...
È stato utile?

Soluzione

Nella query, sostituire T2 con una sottoquery che unisce T1 e T2 e restituisce la descrizione padre, figlio e figlio. Quindi nella funzione sys_connect_by_path, fai riferimento alla descrizione figlio dalla tua subquery.

Altri suggerimenti

Sulla base dell'idea di Mike McAllister, quanto segue utilizza una tabella derivata per ottenere il risultato desiderato:

select
     T.PARENT
    ,T.CHILD
    ,sys_connect_by_path(T.CDESC, '/')
from
    (
        select
             t2.parent      as PARENT
            ,t2.child       as CHILD
            ,t1.description as CDESC
        from
             t1, t2
        where
            t2.child = t1.id
    ) T
where
    level > 1 and connect_by_isleaf = 1
connect by prior
    T.CHILD = T.PARENT

Nel mio problema, tutti i genitori sono ancorati sotto un "super-genitore" root, il che significa che i percorsi possono essere completamente descritti con SYS_CONNECT_BY_PATH, ovviando così alla necessità della tecnica di cagcowboy di concatenare il genitore con il percorso.

SELECT parent, child, parents.description||sys_connect_by_path(childs.description, '/') AS "path"
FROM   T1 parents, T1 childs, T2
WHERE  T2.parent = parents.id
AND    T2.child = childs.id
CONNECT BY PRIOR parent = child
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top