Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Rekursive Abfrage für Stücklisten

Ich denke, Ihre Logik war im Grunde ok. Hier sind zwei Verbesserungen. Erstens ist die Ebene inkrementell, damit Sie sehen können, was mit der Rekursion passiert. Zweitens verwendet es einen expliziten Join:

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;

Ich vermute, Ihr Problem ist die Bedingung where bb.BOMNAME_I like '' mag . Ist es möglich, dass dieser Wert wirklich NULL ist? statt leer?

Sie sollten auch überprüfen, was diese nicht-rekursive Abfrage eine Ebene nach unten macht:

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