Usando il tuo esempio potresti lavorare sul sottoinsieme dei nomi dei genitori nei figli se i nomi dei genitori fossero contenuti all'interno dei nomi delle persone a carico. In tal caso, considera una query di unione:
# GREAT-GRANDPARNTS
SELECT DISTINCT Null As Parent, Parent As Dependent
FROM Ancestry
WHERE Len(Parent) = 1
UNION
# GRANDPARNTS
SELECT DISTINCT Left(Parent, 1) As Parent, Parent As Dependent
FROM Ancestry
WHERE Len(Parent) = 3
UNION
# PARENTS
SELECT DISTINCT Left(Child, 1) As Parent, Child As Dependent
FROM Ancestry
WHERE Len(Child) > 3
UNION
# CHILDREN
SELECT DISTINCT Left(Child, 3) As Parent, Child As Dependent
FROM Ancestry
WHERE Len(Child) > 3;
Ovviamente aggiusta Len()
, Left()
o Mid()
funzioni stringa ed estendono (ovvero, nipoti) in base al modello di nome Ancestry effettivo. Questa soluzione non funzionerà se non è presente alcun riferimento ai genitori nei valori di stringa figlio.