Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Рекурсивна заявка за спецификация на материалите

Мисля, че логиката ти като цяло беше ок. Ето две подобрения. Първо, нивото е инкрементално, така че можете да видите какво се случва с рекурсията. Второ, използва изрично съединение:

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;

Подозирам, че проблемът ви е условието where bb.BOMNAME_I like '' . Възможно ли е тази стойност наистина да е NULL вместо празно?

Трябва също така да проверите какво прави тази нерекурсивна заявка с едно ниво надолу:

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


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. SQL Server 2008 - подреждане по низове с числово число

  2. Зависимо свойство в ReferentialConstraint е съпоставено с колона, генерирана от магазина

  3. Как да изброя всички колони в таблица?

  4. SQL Server заявка - изчисляване на свободните стаи

  5. Задайте стойност по подразбиране в колоната, АКО условието е изпълнено в SQL 2008