Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Requête récursive pour la nomenclature

Je pense que votre logique était fondamentalement correcte. Voici deux améliorations. Tout d'abord, le niveau est incrémentiel afin que vous puissiez voir ce qui se passe avec la récursivité. Deuxièmement, il utilise une jointure explicite :

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;

Je soupçonne que votre problème est la condition where bb.BOMNAME_I like '' . Est-il possible que cette valeur soit vraiment NULL plutôt que vide ?

Vous devriez également vérifier ce que fait cette requête non récursive d'un niveau :

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