mysql 계층 쿼리 조회 질문입니다. 0 6 1,667

by 오라클네티 [MySQL] mysql sql [2020.02.18 18:57:15]


SELECT IF(B.lv = 0 , '*' , null)  as "0",
       IF(B.lv = 1 , '*' , null)  as "1",
       IF(B.lv = 2 , '*' , null)  as "2",
       IF(B.lv = 3 , '*' , null)  as "3",
       IF(B.lv = 4 , '*' , null)  as "4",
       B.lv,
       A.* FROM PT_BOM A,
                (
                    SELECT 0 lv
                         , t1.PART_NO
                         , t1.PART_PARENT
                    FROM PT_BOM t1
                    WHERE (t1.PART_PARENT IS NULL OR t1.PART_PARENT = '')
                    UNION ALL
                    SELECT 1 lv
                         , t2.PART_NO
                         , t2.PART_PARENT
                    FROM PT_BOM t1
                       , PT_BOM t2
                    WHERE (t1.PART_PARENT IS NULL OR t1.PART_PARENT = '')
                      AND t2.PART_PARENT = t1.PART_NO
                    UNION ALL
                    SELECT 2 lv
                         , t3.PART_NO
                         , t3.PART_PARENT
                    FROM PT_BOM t1
                       , PT_BOM t2
                       , PT_BOM t3
                    WHERE (t1.PART_PARENT IS NULL OR t1.PART_PARENT = '')
                      AND t2.PART_PARENT = t1.PART_NO
                      AND t3.PART_PARENT = t2.PART_NO
                    UNION ALL
                    SELECT 3 lv
                         , t4.PART_NO
                         , t4.PART_PARENT
                    FROM PT_BOM t1
                       , PT_BOM t2
                       , PT_BOM t3
                       , PT_BOM t4
                    WHERE (t1.PART_PARENT IS NULL OR t1.PART_PARENT = '')
                      AND t2.PART_PARENT = t1.PART_NO
                      AND t3.PART_PARENT = t2.PART_NO
                      AND t4.PART_PARENT = t3.PART_NO
                    UNION ALL
                    SELECT 4 lv
                         , t5.PART_NO
                         , t5.PART_PARENT
                    FROM PT_BOM t1
                       , PT_BOM t2
                       , PT_BOM t3
                       , PT_BOM t4
                       , PT_BOM t5
                    WHERE (t1.PART_PARENT IS NULL OR t1.PART_PARENT = '')
                      AND t2.PART_PARENT = t1.PART_NO
                      AND t3.PART_PARENT = t2.PART_NO
                      AND t4.PART_PARENT = t3.PART_NO
                      AND t5.PART_PARENT = t4.PART_NO
                )B
WHERE A.PART_NO = B.PART_NO;

 

 

로 쿼리를 작성했는데 .

 

0   1   2   3   4 LV  COMP_CD     NO        PART_NO      PART_PARENT  USE_YN

*                    0    UL              10014    PART_0015    ""                     Y                
    *                1    UL              10015    PART_0002    PART_0015         Y                
    *                1    UL              10016    PART_0004    PART_0015         Y                
*                    0    UL              10022    PART_0009    ""                     Y                
    *                1    UL              10024    PART_0013    PART_0009         Y                
*                    0    UL              10029    PART_0014    ""                     Y                
    *                1    UL              10031    PART_0016    PART_0014         Y                
        *            2    UL              10032    PART_0018    PART_0013         Y                

 

 

이렇게 결과가 나오 더라구요

 

 

0   1   2   3   4 LV  COMP_CD     NO        PART_NO      PART_PARENT  USE_YN

*                    0    UL              10014    PART_0015    ""                Y                
    *                1    UL              10015    PART_0002    PART_0015    Y                
    *                1    UL              10016    PART_0004    PART_0015    Y                
*                    0    UL              10022    PART_0009    ""                Y                
    *                1    UL              10024    PART_0013    PART_0009    Y      

        *            2    UL              10032    PART_0018    PART_0013    Y                
*                    0    UL              10029    PART_0014    ""                Y                
    *                1    UL              10031    PART_0016    PART_0014    Y                

        *            2    UL              10032    PART_0018    PART_0013    Y      <-

 

빨간색으로 강조된 부분이 주황색으로 이동 되어야 옳바른 쿼리인데 쿼리를 어떻게 수정해줘야 할지 모르겠습니다ㅠㅠ

 

by 마농 [2020.02.19 08:11:40]
SELECT CASE b.lv WHEN 0 THEN '*' END "0"
     , CASE b.lv WHEN 1 THEN '*' END "1"
     , CASE b.lv WHEN 2 THEN '*' END "2"
     , CASE b.lv WHEN 3 THEN '*' END "3"
     , CASE b.lv WHEN 4 THEN '*' END "4"
     , b.lv
     , a.*
  FROM pt_bom a
     , (SELECT 0 lv
             , t1.part_no
             , t1.part_parent
             , t1.part_no x
          FROM pt_bom t1
         WHERE (t1.part_parent IS NULL OR t1.part_parent = '')
         UNION ALL
        SELECT 1 lv
             , t2.part_no
             , t2.part_parent
             , CONCAT(t1.part_no, t2.part_no) x
          FROM pt_bom t1
             , pt_bom t2
         WHERE (t1.part_parent IS NULL OR t1.part_parent = '')
           AND t2.PART_PARENT = t1.PART_NO
         UNION ALL
        SELECT 2 lv
             , t3.part_no
             , t3.part_parent
             , CONCAT(t1.part_no, t2.part_no, t3.part_no) x
          FROM pt_bom t1
             , pt_bom t2
             , pt_bom t3
         WHERE (t1.part_parent IS NULL OR t1.part_parent = '')
           AND t2.part_parent = t1.part_no
           AND t3.part_parent = t2.part_no
         UNION ALL
        SELECT 3 lv
             , t4.part_no
             , t4.part_parent
             , CONCAT(t1.part_no, t2.part_no, t3.part_no, t4.part_no) x
          FROM pt_bom t1
             , pt_bom t2
             , pt_bom t3
             , pt_bom t4
         WHERE (t1.part_parent IS NULL OR t1.part_parent = '')
           AND t2.part_parent = t1.part_no
           AND t3.part_parent = t2.part_no
           AND t4.part_parent = t3.part_no
         UNION ALL
        SELECT 4 lv
             , t5.part_no
             , t5.part_parent
             , CONCAT(t1.part_no, t2.part_no, t3.part_no, t4.part_no, t5.part_no) x
          FROM pt_bom t1
             , pt_bom t2
             , pt_bom t3
             , pt_bom t4
             , pt_bom t5
         WHERE (t1.part_parent IS NULL OR t1.part_parent = '')
           AND t2.part_parent = t1.part_no
           AND t3.part_parent = t2.part_no
           AND t4.part_parent = t3.part_no
           AND t5.part_parent = t4.part_no
        ) b
 WHERE a.part_no = b.part_no
 ORDER BY x
;

 


by 마농 [2020.02.19 09:48:46]

MySQL 버전이 어떻게 되나요?
최신 버전이라면? WITH RECURSIVE 를 이용한 계층 쿼리가 가능합니다.


by 오라클네티 [2020.02.19 10:30:12]

마농님 답변 달아주셔서 감사합니다.

Mysql 버전은 5.7.29-log 사용하고 있습니다.

 

알려주신 쿼리로 실행하니 

0 1 2 3 4 자재 코드 품목코드 상위품목
*         10034 연필 없음
  *       10035 나무 연필
  *       10037 나무 색연필
  *       10036 연필
  *       10038 색연필
*         10040 색연필 없음
  *       10037 나무 색연필
  *       10035 나무 연필
  *       10038 색연필
  *       10036 연필
  *       10039 색상

색연필

 

위와 같은 결과가 나오는데

 

0 1 2 3 4 자재 코드 품목코드 상위품목
*         10034 연필 없음
  *       10035 나무 연필
               
  *       10036 연필
               
*         10040 색연필 없음
  *       10037 나무 색연필
               
  *       10038 색연필
               
  *       10039 색상 색연필

 

이렇게 결과가 나오게 쿼리를 작성하고 싶습니다.

어느 부분 쿼리를 참조를 하여 수정을 하면 좋은결과를 얻을수있을지 조언좀 부탁드립니다ㅠ

 

데이터는 이렇게 들어가 있습니다.

품목번호       부모품목번호

PART_0020    ""
PART_0021    PART_0020
PART_0022    PART_0020
PART_0021    PART_0023
PART_0022    PART_0023
PART_0024    PART_0023
PART_0023    ""

 

 

PART_0020    연필
PART_0021    나무
PART_0022    심

PART_0023    색연필
PART_0024    색상
 


by 마농 [2020.02.19 12:10:25]

글쎄요?
주신 쿼리 그대로 이용한 건데요? 정렬만 바꿨습니다.
추가 질문의 결과가 이해가 안가는데요.
만약 동일 자료가 중복되어 나온다면?
실제 자료가 중복되어 들어 있는 것으로 판단됩니다.


by 마농 [2020.02.19 16:06:26]

AND a.part_parent = b.part_parent    -- 조건추가


by 오라클네티 [2020.02.19 17:25:47]

ㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠㅠ 감사합니다 정말 딱 원하는 결과물이 였습니다

query 공부 많이 해야겠습니다ㅠㅠ

감사합니다 (_ _)

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