Eu tenho uma tabela armazenando registros pai/filho como tal:
+-------+------------+---------+---------+------------+-----------+
|custid | custname | deptid | company |parentcustid| enrolled |
+=======+============+=========+=========+============+===========+
| 7060 | Sally | AB1 | comp1 | null | 1 |
| 6953 | Ajit | AB7 | comp2 | 7060 | 1 |
| 6957 | Rahul | DE1 | comp3 | 7060 | 1 |
| 6958 | uday | TG6 | comp4 | 7060 | 1 |
| 6959 | john | HY7 | comp5 | 7060 | 1 |
| 6960 | netaji | HY5 | comp6 | 7060 | 1 |
| 6961 | prakriti | GT6 | comp7 | 7060 | 1 |
| 6962 | sachin | KL7 | comp8 | 7060 | 0 |
| 6963 | santosh | KK5 | comp9 | 7060 | 1 |
| 6964 | Ravi | PP0 | comp10 | 7060 | 1 |
+-------+------------+---------+---------+------------+-----------+
É possível retornar registros em que o registro pai está registrado e o registro filho relacionado não está registrado?
Isso retorna o que eu preciso para 1 cliente específico:
select a.custid, a.custname, a.deptid, a.company, a.parentcustid, a.enrolled
from customer a
where a.company = 'comp1' and a.Enrolled = 1
union all
select a.custid, a.custname, a.deptid, a.company, a.parentcustid, a.enrolled
from customer a
where a.parentcustid= 7060 and b.Enrolled = 0
+-------+------------+---------+---------+------------+-----------+
|custid | custname | deptid | company |parentcustid| enrolled |
+=======+============+=========+=========+============+===========+
| 7060 | Sally | AB1 | comp1 | null | 1 |
| 6962 | sachin | KL7 | comp8 | 7060 | 0 |
+-------+------------+---------+---------+------------+-----------+
Como posso estruturar a consulta para retornar esse tipo de conjunto de resultados para todos os registros pai filho na tabela?
Uma maneira comum de fazer isso no SQL Server é usar um CTE recursivo :
Aqui estão seus dados de teste como uma inserção:
E aqui está como um CTE recursivo procuraria por ele:
Existem alguns Great Posts® escritos sobre eles:
Adam Machanic
Jeff Moden #1 e #2
O falecido grande Dwain Camps
Espero que isto ajude!
Se você tiver apenas um nível de filhos, poderá juntar as tabelas
Assim você não perde a relação entre o registro pai e filho.
Como você sabe que os pais estão matriculados e os filhos não, retornar a
enrolled
coluna não adiciona novas informações.Se você quiser manter a forma original da tabela de resultados, use uma coluna adicional para classificar
Observe que este ORDER BY é aplicado a toda a união, não apenas ao segundo SELECT. Assim as crianças são sempre listadas logo abaixo de seus pais.
Aliás, multiplicar a chave por 2 é suficiente para obter o efeito desejado para a chave de ordem. Ele só fica melhor se você multiplicar por 10. Se seus IDs de cliente sempre tiverem no máximo 4 dígitos, você também pode usar
10000 * custid
para os pais e10000 * parentcustid + custid
para os filhos e ordenar apenas pororderKey
para obter registros bem ordenados.