Oracle의 단순 재귀 쿼리
현재 재귀 쿼리를 이해하고 작성하는 데 문제가 있습니다.재귀 쿼리가 정보 계층을 검색하는 데 사용되는 것은 이해하지만 온라인에서 계층을 이동할 수 있는 간단한 해결책을 찾지 못했습니다.예를 들어, 가계도를 모형화하는 관계가 있다고 가정해 보겠습니다.
create table family_tree (
child varchar(10)
parent varchar(10)
);
만약 제가 이 가계도를 따라 거슬러 올라가 모든 부모를 수집하는 재귀적인 질문을 쓰고 싶다면, 어떻게 해야 할까요?
잘 부탁드립니다.
사용할 수 있습니다.connect by
절
이 경우 SQL은 다음과 같습니다.
select child, parent, level
from family_tree
connect by prior parent = child
만약 제가 이 가계도를 따라 거슬러 올라가 모든 부모를 수집하는 재귀적인 질문을 쓰고 싶다면, 어떻게 해야 할까요?
계층형 쿼리를 사용하고SYS_CONNECT_BY_PATH( column_name, delimiter )
함수:
Oracle 18 설정:
create table family_tree (
child varchar(10),
parent varchar(10)
);
INSERT INTO family_tree ( child, parent )
SELECT 'B', 'A' FROM DUAL UNION ALL
SELECT 'C', 'B' FROM DUAL UNION ALL
SELECT 'D', 'C' FROM DUAL UNION ALL
SELECT 'E', 'D' FROM DUAL UNION ALL
SELECT 'F', 'C' FROM DUAL;
쿼리 1:
SELECT SYS_CONNECT_BY_PATH( parent, ' -> ' ) || ' -> ' || child AS path
FROM family_tree
START WITH parent = 'A'
CONNECT BY PRIOR child = parent;
결과:
PATH
-------------------------
-> A -> B
-> A -> B -> C
-> A -> B -> C -> D
-> A -> B -> C -> D -> E
-> A -> B -> C -> F
제가 잘 모르는 ANSI 구문과 제가 주로 사용하는 Oracle 구문이 있습니다.Oracle 구문은 다음을 사용합니다.CONNECT BY ... PRIOR
나무를 만드는 절과 a.START WITH
트리 걷기를 시작할 위치를 데이터베이스에 알려주는 절입니다.다음과 같이 표시됩니다.
SELECT child, parent, level
FROM family_tree
CONNECT BY ...
START WITH ...
그START WITH
절이 더 쉽습니다.여러분은 나무를 "위로" 보고 있기 때문에, 여러분은 나무를 걷기 시작할 아이를 선택할 것입니다.그래서 이것은 다음과 같습니다.START WITH parent = 'John'
여기가 저희 레벨 1 줄입니다.저는 존의 줄이 나무의 바닥이기 때문에 그를 부모로 두고 아이는 없을 것이라고 생각합니다.
이제 트리의 행들이 서로 어떻게 관련되어 있는지 생각해 보십시오.레벨 2 행을 보고 있는 경우, "John" 행의 올바른 행인지 어떻게 알 수 있습니까?이 경우 하위 열에 John이 포함됩니다.그래서 우리는 다음의 조항을 원합니다.CONNECT BY PRIOR parent = child
즉, "이전 행의 부모는 이 행의 자식과 같습니다."
쿼리는 다음과 같습니다.
SELECT child, parent, level
FROM family_tree
CONNECT BY PRIOR parent = child
START WITH parent = 'John'
(이것은 실제 아이들이 두 명의 부모를 가지고 있기 때문에 약간 이상한 예이지만, 그렇게 되면 더 복잡해질 것입니다.)
다음 사항에 대해 잘 알고 계십니까?SCOTT.EMP
표요? "표준"에 있습니다.SCOTT
스키마(불행히도 버전 12.1 또는 그 이후로 더 이상 Oracle 데이터베이스의 모든 복사본과 함께 사전 패키지화되지 않음).데이터베이스를 확인하십시오. 데이터베이스를 찾을 수 있습니다.또는 DBA에게 문의하십시오.
어쨌든: 표에는 중소기업의 직원 14명이 나와 있고, 직원의 신분증과 관리자의 신분증이 포함되어 있습니다.따라서 특정 직원부터 시작하여 해당 직원의 가장 높은 수준의 상사를 찾고자 한다고 가정합니다.(테스트 문제와 유사합니다.)이 특정 계층에서 가장 높은 수준의 "조상"은 고유하지만, 이는 관련이 없습니다. 각 부서에 "부서장"이 있고 부서장 위에 CEO가 없는 경우 재귀 쿼리는 동일한 방식으로 작동합니다.
이 합의에서, "모든 상사의 상사"를 식별하는 것은 쉽습니다. 그는 상사가 없습니다.행에서 는 의그행관는자 ID입니다.null
이것은 트리와 같은 계층의 "루트"(또는 "루트")에 대한 매우 일반적인 배열입니다.
다음은 특정 직원 ID로 시작하여 재귀 쿼리를 사용하여 상사를 찾는 방법입니다. 즉, 제가 올바르게 이해했다면 "어떤 방법으로든" 문제를 해결하는 것에 관심이 없습니다. 오히려 재귀 쿼리가 어떻게 작동하는지 알고 싶을 것입니다.진행 중인 모든 것을 이해할 수 있는 작은 예입니다.)
with
r ( empno, mgr ) as (
select empno, mgr -- ANCHOR leg of recursive query
from scott.emp
where empno = 7499
union all
select e.empno, e.mgr -- RECURSIVE leg of recursive query
from scott.emp e inner join r on e.empno = r.mgr
)
select empno
from r
where mgr is null
;
저는 당신이 이 예를 이해하는 데 어려움을 겪을 수 있는 부분을 추측하려고 노력하지 않을 것입니다.대신, 당신이 물어볼 때까지 기다리겠습니다.
언급URL : https://stackoverflow.com/questions/50123407/simple-recursive-query-in-oracle
'programing' 카테고리의 다른 글
Spring Boot 사용자 지정 favicon.ico가 표시되지 않음 (0) | 2023.08.09 |
---|---|
PowerShell을 사용하여 원본 서버의 동일한 디렉터리 구조에 있는 폴더 및 하위 폴더의 복사 항목 파일 (0) | 2023.08.09 |
Spring Boot JPA H2 콘솔이 실행되고 있지 않습니다. application.properties 파일이 무시됩니다. (0) | 2023.08.09 |
모든 Python 클래스가 개체를 확장해야 합니까? (0) | 2023.08.09 |
각도 2에서 관측 가능한 데이터를 가져오는 방법 (0) | 2023.08.09 |