계층구조에서 같은 구조가 반복될때 한번만 보여주기 0 13 961

by MS [SQL Query] [2019.04.18 11:13:55]


pic.png (7,566Bytes)
p7.png (25,355Bytes)

with t as (
select 0 lvl, 'A' item,  0 seq from dual union all
select 1,     'B',       1 from dual union all
select 2,     'C',       2 from dual union all
select 3,     'D',       3 from dual union all
select 3,     'E',       4 from dual union all
select 1,     'F',       5 from dual union all
select 2,     'G',       6 from dual union all
select 3,     'C',       7 from dual union all
select 4,     'D',       8 from dual union all
select 4,     'E',       9 from dual union all
select 1,     'H',       10 from dual union all
select 2,     'C',       11 from dual union all
select 3,     'D',       12 from dual union all
select 3,     'E',       13 from dual
)

원하는 결과내용

0    A    0
1    B    1
2    C    2
3    D    3
3    E    4
1    F    5
2    G    6
3    C    7
1    H    10
2    C    11
 

C자식으로 D,E가 있는데 C가 아래도 2번 사용되었습니다.

 

by 마농 [2019.04.18 13:10:13]

계층 구조는 부모코드와 자식코드 구조인데. 이건 구조가 다른데요?
여기는 레벨과 순번으로 계층구조를 처리하나요?
이게 원본 테이블 맞나요?
왜 중복되는 C 는 나와도 되는데 D,E 는 나오면 안되나요?


by MS [2019.04.18 14:09:44]

with t as (
select '-' parent, 'A' item,  0 seq from dual union all
select A,     'B',       1 from dual union all
select B,     'C',       2 from dual union all
select C,     'D',       3 from dual union all
select C,     'E',       4 from dual union all
select A,     'F',       5 from dual union all
select F,     'G',       6 from dual union all
select G,     'C',       7 from dual union all
select C,     'D',       8 from dual union all
select C,     'E',       9 from dual union all
select A,     'H',       10 from dual union all
select H,     'C',       11 from dual union all
select C,     'D',       12 from dual union all
select C,     'E',       13 from dual
)

질문 감사합니다.

원래 계층구조는 위와 같습니다. 이것을 받아서 migration을 합니다.

C-D와 C-E관계는 한번 생성되면 아래에서는 C만 가져와도 이미 D,E의 관계가 있으므로 별도의 생성이 필요하지 않아서 C-D와 C-E관계는 정보는 제거 하고 싶습니다. C를 제거하면 B-C, G-C, H-C정보를 알수 없으므로 삭제하지 않았습니다.

레벨과 Item관계는 해당 시스템에서 migration을 위해 지원하는 API format입니다.

모자관계에서 제거 작업이 되어도 됩니다.


by 마농 [2019.04.18 14:25:13]

왠지 원본을 잘못 올려주신 것 같은 느낌이 드네요.
8,9,12,13 은 없을 것 같다는 생각이 드네요.
정확하게 원본 올려주신 것 맞나요? 중간 집합 올려주신 건 아닌가요?


by MS [2019.04.18 15:48:06]

설명을 드리겠습니다. 위 원본에 이미지 하나를 첨부 했습니다.

CAD(Catia)에서 CAD 구조를 받아서 PLM시스템에 upload해야합니다. 그래서 모든 BOM관계는 수량이 1이고요.

그런데 하위 부품까지 구조가 다 나오게 됩니다. 그러다 보니 작은 모듈화된 부품도 하위에 계층구조가 계속 반복해 나옵니다.

그러다 보니 BOM의 수량도 증가하고 시스템이 이미 BOM관계를 만든 모듈의 하부 구조도 계속 반복해서 overwirite하는 현상이 발생합니다.

설명이 되었는지 모르겠습니다.


by 마농 [2019.04.18 15:56:50]

처음 주신 자료는 원본이 아닌 듯 하고
두번째 주신 자료는 중복자료가 있는게 이상하구요.
세번째 주신 자료는 그냥 부연설명하는 것 밖에 안되네요.
질문을 이해하지 못해서 그러는게 아닙니다.
질문은 충분히 이해했는데.
저는 단지 원본 테이블이 어떻게 생긴지가 궁굼할 뿐입니다.
주신 정보는 의심이 가는 부분이 많아서 그래요.
중간 집합으로 질문하는 것은 좀 꺼려 합니다.


by MS [2019.04.18 16:21:10]

원본을 올렸습니다. CAD에서 excel로 나온 내용입니다. CADBOM시작 부분이 있고요.

아래 두개는 30-113544로 시작하는 부품의 정보입니다.

 


by 마농 [2019.04.18 16:35:58]

원본을 그대로 이미지로 올려달라는게 아니구요.
샘플을 달라는 건데요. 원본의 특성이 그대로 반영된 샘플이요.
주신 샘플이 의심가는 부분이 있어서 그런거죠.
실제로 중복이 존재하는지? 하는 부분
그리고 이미지를 보면 부모코드 같은 건 안보이네요?
ID 를 이용해 계층구조를 파악하는 듯 한데요.
간략 샘플 주세요. 이미지 말고 텍스트로요.


by MS [2019.04.18 17:00:07]

텍스트 문서는 곧 올리겠습니다


by MS [2019.04.18 17:23:29]

with t as (         
select 1 seq, '0' lvl, 'P3011-BOM' itemid,    '' englishname, 'A.1' rev  from dual union all
select 17,    '3',    'F1000-P3011',    '',    'A.1'  from dual union all
select 18,    '3|1',    'F1001-P3011',    '',    'K.1'  from dual union all
select 19,    '3|1|1',    '1000100XEC52',    'ENGINE ASSY',    'D.1'  from dual union all
select 20,    '3|1|2',    '1000100XEC53',    'ENGINE ASSY',    'D.1'  from dual union all
select 21,    '3|1|3',    '3708100AEC01',    'STARTER ASSY',    'B.1'  from dual union all
select 22,    '3|1|4',    'Q184U1060F70SE',    'HEX FLANGE BOLT',    'A.1'  from dual union all
select 23,    '3|1|5',    'Q184U10135F70SE',    'HEX FLANGE BOLT',    'A.1'  from dual union all
select 24,    '3|1|6',    'Q184U1080F70SE',    'HEX FLANGE BOLT',    'A.1'  from dual union all
select 25,    '3|1|7',    'Q184U1080F70SE',    'HEX FLANGE BOLT',    'A.1'  from dual union all
select 26,    '3|1|8',    '1002019XEC61',    'HYDRAULIC TORQUE CONVERTER ASSY',    'A.1'  from dual union all
select 27,    '3|1|8|1',    'Q1840610FDE1',    'HEX FLANGE BOLT1',    'A.1'  from dual union all
select 28,    '3|1|8|2',    'Q1840610FDE2',    'HEX FLANGE BOLT2',    'A.1' from dual union all
select 164,    '3|2',    'F1006-P3011',    '',    'C.1'  from dual union all
select 165,    '3|2|1',    '8402500XPW01A',    'HOOD ASSY,ENGINE TRIM', 'B.1'  from dual union all
select 166,    '3|2|1|1',    '8402501XPW01A',    'HOOD,ENGINE TRIM',    'A.3'  from dual union all
select 167,    '3|2|1|2',    '8402502XPW01A',    'HEAT SHIELD,ENGING TRIM HOOD',    'A.3'  from dual union all
select 168,    '3|2|1|3',    '8402326-V08',    'GUM COVER',    'A.1'  from dual union all
select 169,    '3|2|1|4',    '1002019XEC61',    'HYDRAULIC TORQUE CONVERTER ASSY',    'A.1'  from dual union all
select 170,    '3|2|1|4|1',    'Q1840610FDE1',    'HEX FLANGE BOLT1',    'A.1'  from dual union all
select 171,    '3|2|1|4|2',    'Q1840610FDE2',    'HEX FLANGE BOLT2',    'A.1'  from dual
)

위에 그림에서 노란색 부분이 겹치는 부분입니다.


by 마농 [2019.04.18 17:47:55]
WITH t AS
(
SELECT 1 seq, '0' lvl, 'P3011-BOM' itemid FROM dual
UNION ALL SELECT  17, '3'        , 'F1000-P3011'    FROM dual
UNION ALL SELECT  18, '3|1'      , 'F1001-P3011'    FROM dual
UNION ALL SELECT  19, '3|1|1'    , '1000100XEC52'   FROM dual
UNION ALL SELECT  20, '3|1|2'    , '1000100XEC53'   FROM dual
UNION ALL SELECT  21, '3|1|3'    , '3708100AEC01'   FROM dual
UNION ALL SELECT  22, '3|1|4'    , 'Q184U1060F70SE' FROM dual
UNION ALL SELECT  23, '3|1|5'    , 'Q184U10135F70SE'FROM dual
UNION ALL SELECT  24, '3|1|6'    , 'Q184U1080F70SE' FROM dual
UNION ALL SELECT  25, '3|1|7'    , 'Q184U1080F70SE' FROM dual
UNION ALL SELECT  26, '3|1|8'    , '1002019XEC61'   FROM dual
UNION ALL SELECT  27, '3|1|8|1'  , 'Q1840610FDE1'   FROM dual
UNION ALL SELECT  28, '3|1|8|2'  , 'Q1840610FDE2'   FROM dual
UNION ALL SELECT 164, '3|2'      , 'F1006-P3011'    FROM dual
UNION ALL SELECT 165, '3|2|1'    , '8402500XPW01A'  FROM dual
UNION ALL SELECT 166, '3|2|1|1'  , '8402501XPW01A'  FROM dual
UNION ALL SELECT 167, '3|2|1|2'  , '8402502XPW01A'  FROM dual
UNION ALL SELECT 168, '3|2|1|3'  , '8402326-V08'    FROM dual
UNION ALL SELECT 169, '3|2|1|4'  , '1002019XEC61'   FROM dual
UNION ALL SELECT 170, '3|2|1|4|1', 'Q1840610FDE1'   FROM dual
UNION ALL SELECT 171, '3|2|1|4|2', 'Q1840610FDE2'   FROM dual
)
SELECT *
  FROM (SELECT a.seq, a.lvl, a.itemid
             , b.itemid p_itemid
             , ROW_NUMBER() OVER(PARTITION BY a.itemid, b.itemid ORDER BY a.seq) rn
          FROM t a
             , t b
         WHERE b.lvl(+) = SUBSTR(a.lvl, 1, INSTR(a.lvl, '|', -1)-1)
        )
 WHERE rn = 1
 ORDER BY seq
;

 


by MS [2019.04.18 19:48:06]

동작합니다. 흠. SQL은 간단한데 한참을 공부해야 할듯합니다.

감사합니다.


by MS [2019.04.19 00:18:17]

죄송합니다. 조건 하나를 빠트리고 말씀 안드렸네요. 

seq 24, 25에 있는 Q184U1080F70SE는 둘다 같은 부모 밑에 두번 사용되는 bolt인데 이것을 나오게 할수 있나요?


by 마농 [2019.04.19 11:22:00]
, RANK() OVER(PARTITION BY a.itemid, b.itemid ORDER BY b.lvl) rn

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입