작성
·
10
·
수정됨
답변 2
0
안녕하세요. 질문에 아래와 같이 답변 드립니다. 답변이 도움이 되었으면 좋겠네요. 감사합니다.
다른 강의에서 Prior 자식 = 부모가 순방향이라고 하는 경우가 있나 보네요. 제가, 해당 강의를 듣지 않았기 때문에 뭐라고 말씀드리기는 어려울 거 같습니다..
일반적으로 설명하자면, Prior 라는 키워드는 이전 행을 의미합니다. 만약 Prior empno = mgr (Prior 부모 = 자식)과 같이 작성하면, 이전 행의 사원 번호와 현재 행의 매니저 번호가 동일한 값을 찾는 방식으로 전개합니다. 이는 순방향입니다. 이때 시작점은 Start with mgr is null로 표현합니다. 왜냐하면 최상위 매니저 번호에서 아래 쪽으로 찾아 나가기 때문입니다.
만약 Prior mgr = empno (Prior 자식 = 부모)와 같이 찾아갈 경우 역방향 전개입니다. 이때 시작점은 특정 지점(ex.start with ename = 'SMITH')을 선택합니다. 왜냐하면 특정 행에서 부터 상위로 찾아나가는 방식으로 이전 행의 매니저 번호와 현재 행의 사원번호가 동일한 값을 기준으로 찾기 때문입니다.
순방향 역방향은 단순히 Prior 키워드만 가지고 판단하기는 어렵습니다. Start with 구문의 시작점을 보고 함께 판단해야 합니다. Prior 키워드만 사용해서 판단하기 때문에 매우 혼란스러운 경우가 생기는 것 같습니다.
노랭이 문제집의 63번 문제 보기 4번은 2군데가 잘못되어 있습니다.
보기 4번: ④ 오라클의 계층형 질의문에서 PRIOR 키워드는 CONNECT BY 절에서만 사용될 수 있으며, PRIOR 자식 = 부모 형태로 사용하면 순방향 전개로 수행된다.
1) 첫 번째 잘못된 부분은 'Prior 키워드가 Connect By 절에서만' 사용될 수 있다고 한 부분입니다. Prior 키워드는 Select 절에서도 사용될 수 있습니다. 이때 Prior 키워드는 현재 행의 부모(이전) 행의 값을 가져오는 용도로 사용합니다. 노랭이 해설지에는 이 부분에 대한 설명만 제공하고 있습니다.
2) 두 번째 잘못된 부분은 'Prior 자식 = 부모 형태로 사용하면 순방향 전개로 수행된다' 라고 한 것입니다. 순방향은 Prior 부모 = 자식입니다. 부모 행을 기준으로 자식을 찾아나가기 때문에 순방향입니다. 역방향은 Prior 자식 = 부모입니다. 자식을 기준으로 부모행을 찾아나가기 때문에 역방향입니다. (아마도 Prior 키워드만 가지고 순방향, 역방향을 알기가 어렵기 때문에 위 1)번만 설명한게 아닌가 짐작해봅니다)
참고로.. 위 1번과 2번을 확인할 수 있는 쿼리를 아래에 작성해두었습니다.
-- 순방향 전개
SELECT
LEVEL,
LPAD(' ', (LEVEL-1)*4) || ENAME AS "직원명",
EMPNO,
MGR,
-- (1) 현재 행의 상사(부모)의 ENAME 값을 가져옵니다.
PRIOR ENAME AS "직속_상사명"
FROM
EMP
START WITH MGR IS NULL -- 최상위(루트)는 MGR이 NULL인 KING
CONNECT BY PRIOR EMPNO = MGR; -- 순방향 전개 (부모.EMPNO = 자식.MGR);
-- 역방향 전개
SELECT
LEVEL,
LPAD(' ', (LEVEL-1)*3) || ENAME AS 조직도,
EMPNO,
MGR
FROM EMP
START WITH ENAME = 'SMITH' -- SMITH를 최하위 노드로 지정 (LEVEL 1)
CONNECT BY PRIOR MGR = EMPNO -- 역방향 전개 (자식.MGR = 부모.EMPNO). 자식(MGR)을 기준으로 부모(EMPNO)를 찾으며 위로 전개 (역방향)
ORDER SIBLINGS BY EMPNO;
emp 테이블 데이터는 아래 링크에서 확인하시면 되겠습니다.
0
안녕하세요, 인프런 AI 인턴입니다. 문진웅님.
계층형 질의에서 PRIOR
연산자 사용법은 혼란을 일으킬 수 있습니다. 간단히 설명드리면:
CONNECT BY PRIOR 부모 = 자식
는 순방향 탐색을 의미합니다. 이는 부모로부터 자식으로 내려가는 계층 구조를 형성합니다.
CONNECT BY 자식 = PRIOR 부모
는 역방향 탐색을 의미합니다. 이는 자식으로부터 부모로 올라가는 계층 구조를 형성합니다.
문진웅님이 언급하신 것처럼, 다른 강의에서는 PRIOR 자식 = 부모
가 순방향으로 설명될 수 있습니다. 그러나 이 구문은 오히려 자식에서 부모로 거슬러 올라가는 역방향 탐색에 가깝습니다. 이는 데이터가 가진 계층 구조를 어느 방향으로 탐색하느냐에 따라 달라지는 문제입니다.
그리고 노랭이 63번 문제와 관련해서, CONNECT BY
절은 계층 구조를 탐색하는 데 사용되는 특별한 문법입니다. “connect by 절에만 사용 가능하다”에 대한 틀린 진술은, 일부 설명이나 자료에서 잘못된 해석이 이루어졌을 수 있습니다.
관련 질문은 이전에 다른 학습자들에 의해 다뤄진 적이 있습니다. 다음 유사한 질문 링크를 참고하시면 보다 더 명확한 설명을 확인할 수 있습니다:
PRIOR
의 사용 방식과 방향성에 대한 해설이 이루어지고 있습니다.질문 내용이 복잡하게 느껴질 수 있지만, 계층 질의의 컨셉과 PRIOR
의 역할 이해에 도움이 되길 바랍니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.