Como um pai pode ter uma linha filho em algumas dessas tabelas, você deve usar LEFT OUTER JOIN.
LEFT OUTER JOIN une duas tabelas retornando todas as linhas da tabela LEFT, neste caso A e todas as correspondências das outras tabelas. Quando não houver correspondência retornará NULL nas colunas correspondentes das tabelas que não houve correspondência.
SELECT *
FROM A
LEFT OUTER JOIN B
ON A.Id = B.ParentID
LEFT OUTER JOIN C
ON A.Id = C.ParentID
LEFT OUTER JOIN P
ON C.Id = P.ParentID
LEFT OUTER JOIN Q
ON C.Id = Q.ParentID
LEFT OUTER JOIN D
ON A.Id = D.ParentID
LEFT OUTER JOIN E
ON A.Id = E.ParentID
LEFT OUTER JOIN F
ON A.Id = F.ParentID
LEFT OUTER JOIN X
ON F.Id = X.ParentID
LEFT OUTER JOIN Y
ON F.Id = Y.ParentID
LEFT OUTER JOIN G
ON A.Id = G.ParentID
EDITAR
Eu adicionei uma maneira de adicionar subfilhos. Eu os intencionei mais apenas para torná-los óbvios em uma representação visual. Mas cuidado... se isso levar os subfilhos a terem outros subfilhos etc, talvez sua estrutura não seja a ideal.