Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Consulta recursiva para lista de materiais


Eu acho que sua lógica foi basicamente ok. Aqui estão duas melhorias. Primeiro, o nível é incremental para que você possa ver o que acontece com a recursão. Segundo, ele usa uma junção explícita:
With BMStudy as (
      select bm.ppn_i, bm.cpn_i, bm.bomname_i, bm.QUANTITY_I, 1 as BOMLevel
      from BM010115 bm
      where bm.PPN_I like '0123105-HWT' and bm.BOMNAME_I like ''
      UNION ALL
      select bb.ppn_i, ba.cpn_i, bb.bomname_i, ba.quantity_i, (BOMLevel + 1) as BOMLevel
      from BMStudy ba join
           BM010115 bb
           on ba.cpn_i = bb.ppn_i
      where bb.BOMNAME_I like ''
     )
select * from BMStudy;

Suspeito que seu problema seja a condição where bb.BOMNAME_I like '' . É possível que este valor seja realmente NULL em vez de em branco?

Você também deve verificar o que essa consulta não recursiva de um nível faz:
      select bb.ppn_i, ba.cpn_i, bb.bomname_i, ba.quantity_i, (BOMLevel + 1) as BOMLevel
      from BM010115 ba join
           BM010115 bb
           on ba.cpn_i = bb.ppn_i
      where bb.BOMNAME_I like '' and
            (ba.PPN_I like '0123105-HWT' and ba.BOMNAME_I like '')