иерархический запрос в Snowflake - PullRequest
0 голосов
/ 07 мая 2020
• 1000 этот вывод enter image description here
PPBOM PPMAT PMAT LEVEL COMPONENT 
bom1  1001  1001 1     1002 
bom1  1001  1001 1     1003 
bom1  1001  1001 1     1004 
bom1  1001  1001 1     1005 
bom1  1001  1002 2     1009 
bom1  1001  1002 2     1010 
bom1  1001  1009 3     1011 
bom1  1001  1009 3     1012

1 Ответ

2 голосов
/ 07 мая 2020

, поэтому вы хотите использовать CONNECT BY , но пробел с моей работой, как root ответ только на потомков BOM1 / 1001, который разрешает класс START WITH, иначе я собирался попробовать QUALIFY на SPLIT(path,':')[1] = 1001

WITH mast AS (
    SELECT * from values 
      ('bom1', 1001)
      ,('bom2', 2001)
      ,('bom3', 3001)
      ,('bom4', 4001)
      ,('bom5', 5001)
      ,('bom6', 6001)
      ,('bom7', 7001)
      ,('bom8', 8001)
      ,('bom9', 1002)
      ,('bom10', 1009)
      v(bom, material)
), stop as (
    SELECT * from values 
      ('bom1', 1002)
      ,('bom1', 1003)
      ,('bom1', 1004)
      ,('bom1', 1005)
      ,('bom2', 2002)
      ,('bom2', 2003)
      ,('bom2', 2004)
      ,('bom2', 2005)
      ,('bom2', 2006)
      ,('bom9', 1009)
      ,('bom9', 1010)
      ,('bom10', 1011)
      ,('bom10', 1012)
      v(bom, comp)
), hiearch AS (
    select pm.bom, pm.material as pmat, s.comp
    from mast pm
    join stop s on pm.bom = s.bom
)
select 
    --sys_connect_by_path(pmat, ':') as path,
    h.pmat, 
    level,
    h.comp
from hiearch h
start with pmat = 1001
connect by pmat = prior comp
order by pmat, comp

дает:

PMAT    LEVEL   COMP
1001    1   1002
1001    1   1003
1001    1   1004
1001    1   1005
1002    2   1009
1002    2   1010
1009    3   1011
1009    3   1012

поэтому, если вы хотите более сложный root logi c, вы можете это сделать с помощью предложения where, например:

select * from (
  select 
      sys_connect_by_path(pmat, ':') as path,
      h.pmat, 
      level,
      h.comp
  from hiearch h
  connect by pmat = prior comp
  order by pmat, comp
)
where split(path,':')[1] = '1001'

с обновленным требованием для включения имени / кода узла root, можно выполнить с помощью:

WITH hiearch AS (
    select pm.bom, pm.material as pmat, s.comp
    from mast pm
    join stop s on pm.bom = s.bom
)
select split(bom_path,':')[1] as bom
    ,split(pmat_path,':')[1]::number as ppmat
    ,pmat
    ,level
    ,comp
from (
  select 
      sys_connect_by_path(h.pmat, ':') as pmat_path,
      sys_connect_by_path(h.bom, ':') as bom_path,
      h.pmat, 
      level,
      h.comp
  from hiearch h
  start with pmat = 1001
  connect by pmat = prior comp
  order by pmat, comp
)
order by 1,3;
...