I fratelli di un dato nodo avrebbero lo stesso antenato. Tuttavia, questo includerebbe "1" così come il tuo elenco:
select t.*
from table t
where t.ancestor = (select ancestor from table t2 where t.id = 2);
Nella tua tabella, non sono sicuro di cosa significhi per ancestor
essere uguale a descendant
. Ma penso che la seguente sia la query che desideri:
select t.*
from table t
where t.ancestor = (select ancestor from table t2 where t2.id = 2) and
t.ancestor <> t.descendant and
t.id <> 2;
MODIFICA:
Puoi farlo come esplicito unisciti in questo modo:
select t.*
from table t join
table t2
on t.ancestor = t2.ancestor and
t2.id = 2 a
where t.id <> 2 and
t.ancestor <> t.descendant;
Nota:ho anche aggiunto la condizione t.id <> 2
quindi "2" non è considerato un fratello di per sé.