계층 쿼리 완성했지만, 설명을 못하겠네요 0 2 2,158

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 

추가했더니, 제가 원하는 결과가 나왔습니다.

누군가에게 왜 이렇게 작성했는지 설명하라면, ????

 

설명 좀 해주시면 감사하겠습니다.

by jkson [2019.03.03 16:42:58]

CONNECT BY 문은 이전과 이후 데이터의 상관관계로 다음 데이터를 가져오는 거예요. PRIOR GRP = 0인 데이터는 딱 2개죠. CHAIN, SYSTEM.

이 데이터들의 NBR은 30과 100입니다. PRIOR NBR = GRP 조건으로 다음 데이터를 가져와야겠죠?

따라서 GRP 30인 데이터와, GRP 100인 데이터만 다음 데이터로 가져옵니다.

이 데이터들은 GRP가 0이 아니므로 다음 데이터를 안 가져오게 되죠. 


by 마농 [2019.03.04 08:36:30]

보통은 자식은 하나의 부모만 가지는게 일반적인데.
30 의 부모가 0 과 100 두가지여서 그런 듯 하네요.
그냥 계층쿼리를 전개하면 100의 자식인 30 밑으로 또다시 자식이 연결되게 되는데.
이렇게 되는걸 원하지 않는 것 같네요.
부모가 0 인 것만 자식을 연결하겠다는 조건(PRIOR grp = 0) 보다는
어차피 부모는 0인 걸로 시작했으니
레벨 2 까지만 연결하겠다는 조건이 더 깔끔할 것 같네요.(LEVEL <= 2)

2 레벨 까지만 계층 전개 하는게 맞는 건인지?
아니면, 해당 조건이 없는 원래의 결과가 맞는 것일 수도 있구요.
아니면, 데이터 자체에 오류가 있는 것으로 데이터를 수정하는게 맞을 수도 있구요.

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