Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Interrogazione ricorsiva per la distinta base

Penso che la tua logica fosse sostanzialmente ok. Ecco due miglioramenti. Innanzitutto, il livello è incrementale in modo da poter vedere cosa succede con la ricorsione. In secondo luogo, utilizza un join esplicito:

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;

Sospetto che il tuo problema sia la condizione where bb.BOMNAME_I like '' . È possibile che questo valore sia davvero NULL anziché vuoto?

Dovresti anche controllare cosa fa questa query non ricorsiva di un livello inferiore:

      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 '')