by 안떠니 [SQL Query] 계층쿼리 CONNECT BY START WITH [2019.03.02 06:08:10]
WITH mlink(id, grp, nbr, url, dsc ) AS ( SELECT 1, 0, 100, '---------', 'System' FROM dual UNION ALL SELECT 2, 100, 30, 'Alarm.rpt', 'Alarm' FROM dual UNION ALL SELECT 3, 100, 35, 'Matrix.rpt', 'Matrix' FROM dual UNION ALL SELECT 4, 100, 45, 'Roles.rpt', 'Roles' FROM dual UNION ALL SELECT 5, 0, 30, '---------', 'Chain' FROM dual UNION ALL SELECT 6, 30, 10, 'Invent.rpt', 'Invent' FROM dual UNION ALL SELECT 7, 30, 15, 'Detail.rpt', 'Detail' FROM dual UNION ALL SELECT 8, 30, 20, 'Summary.rpt','Summary' FROM dual ) SELECT * FROM mlink START WITH grp = 0 CONNECT BY PRIOR grp = 0 AND PRIOR nbr = grp ORDER SIBLINGS BY grp, nbr
이렇게 저렇게 해보다, 우연히(본능적으로??) CONNECT BY 에
PRIOR grp = 0 AND
추가했더니, 제가 원하는 결과가 나왔습니다.
누군가에게 왜 이렇게 작성했는지 설명하라면, ????
설명 좀 해주시면 감사하겠습니다.
보통은 자식은 하나의 부모만 가지는게 일반적인데.
30 의 부모가 0 과 100 두가지여서 그런 듯 하네요.
그냥 계층쿼리를 전개하면 100의 자식인 30 밑으로 또다시 자식이 연결되게 되는데.
이렇게 되는걸 원하지 않는 것 같네요.
부모가 0 인 것만 자식을 연결하겠다는 조건(PRIOR grp = 0) 보다는
어차피 부모는 0인 걸로 시작했으니
레벨 2 까지만 연결하겠다는 조건이 더 깔끔할 것 같네요.(LEVEL <= 2)
2 레벨 까지만 계층 전개 하는게 맞는 건인지?
아니면, 해당 조건이 없는 원래의 결과가 맞는 것일 수도 있구요.
아니면, 데이터 자체에 오류가 있는 것으로 데이터를 수정하는게 맞을 수도 있구요.