Уровень захвата в многоуровневом запросе спецификации sql - PullRequest
0 голосов
/ 31 марта 2020

У меня следующий запрос для захвата многоуровневой спецификации. Теперь я знаю все дочерние элементы для родительского элемента, но есть ли способ получить уровень и в этом запросе

with mlBOM
AS (
   select bom_item_material_number, bom_item_component
   from BOM_TABLE bom
           where not exists (
      select *
      from BOM_TABLE BOM  inner join
      BOM_TABLE  BOM1
      on BOM1.bom_item_component = BOM.bom_item_material_number
    )
   union all 
   select  BOM.bom_item_material_number, 
   BOM.bom_item_component
   from BOM_TABLE  BOM
   inner join BOM_TABLE mlBOM on mlBOM.bom_item_component = BOM.bom_item_material_number
) select * 
from mlBOM 
;

Спасибо,

Работает на DBeaver Postgressql база данных

1 Ответ

0 голосов
/ 31 марта 2020

Вы добавляете целочисленный столбец, который начинается с 1 и увеличиваете его для каждой итерации:

with recursive mlbom as (
    select bom_item_material_number, bom_item_component, 1 lvl
    from bom_table bom
    where not exists (
        select 1
        from bom_table bom1 
        where bom1.bom_item_component = bom.bom_item_material_number
    )
   union all 
   select bom.bom_item_material_number, bom.bom_item_component, mlbom.lvl + 1
   from bom_table bom
   inner join mlbom on mlbom.bom_item_component = bom.bom_item_material_number
) 
select * from mlbom ;

Я сделал несколько исправлений в запросе:

  • для объявления cte требуется ключевое слово recursive

  • , поэтому нет необходимости join в подзапросе exists привязки рекурсивного запроса

  • предположительно, рекурсивная часть запроса должна присоединиться bom к mlbom вместо самостоятельного объединения bom.

...