반응형
자체 참조 테이블(Oracle)에 대한 SQL 재귀 쿼리
다음 샘플 데이터가 있다고 가정합니다.
| Name | ID | PARENT_ID |
-----------------------------
| a1 | 1 | null |
| b2 | 2 | null |
| c3 | 3 | null |
| a1.d4 | 4 | 1 |
| a1.e5 | 5 | 1 |
| a1.d4.f6 | 6 | 4 |
| a1.d4.g7 | 7 | 4 |
| a1.e5.h8 | 8 | 5 |
| a2.i9 | 9 | 2 |
| a2.i9.j10| 10 | 9 |
accountId = 1에서 시작하는 모든 레코드를 선택하고 싶기 때문에 예상 결과는 다음과 같습니다.
| Name | ID | PARENT_NAME | PARENT_ID |
-------------------------------------------
| a1 | 1 | null | null |
| a1.d4 | 4 | a1 | 1 |
| a1.e5 | 5 | a1 | 1 |
| a1.d4.f6 | 6 | a1.d4 | 4 |
| a1.d4.g7 | 7 | a1.d4 | 4 |
| a1.e5.h8 | 8 | a1.e5 | 5 |
현재 재귀 선택을 할 수 있지만 부모 참조에서 데이터에 액세스할 수 없으므로 parent_name을 반환할 수 없습니다.사용하고 있는 코드는 (간단한 예에 따라) 다음과 같습니다.
SELECT id, parent_id, name
FROM tbl
START WITH id = 1
CONNECT BY PRIOR id = parent_id
위의 검색에는 어떤 SQL을 사용해야 합니까?
장래 희망자를 위한 추가 키워드: 같은 표에서 부모 키로 표시되는 계층 데이터를 선택하는 SQL
용도:
SELECT t1.id,
t1.parent_id,
t1.name,
t2.name AS parent_name,
t2.id AS parent_id
FROM tbl t1
LEFT JOIN tbl t2 ON t2.id = t1.parent_id
START WITH t1.id = 1
CONNECT BY PRIOR t1.id = t1.parent_id
PRIVER를 사용하면
그렇게
SELECT id, parent_id, PRIOR name
FROM tbl
START WITH id = 1
CONNECT BY PRIOR id = parent_id`
루트 이름을 가져오려면
SELECT id, parent_id, CONNECT_BY_ROOT name
FROM tbl
START WITH id = 1
CONNECT BY PRIOR id = parent_id
새 중첩 조회 구문 사용
with q(name, id, parent_id, parent_name) as (
select
t1.name, t1.id,
null as parent_id, null as parent_name
from t1
where t1.id = 1
union all
select
t1.name, t1.id,
q.id as parent_id, q.name as parent_name
from t1, q
where t1.parent_id = q.id
)
select * from q
이거 하고 싶어?
SELECT id, parent_id, name,
(select Name from tbl where id = t.parent_id) parent_name
FROM tbl t start with id = 1 CONNECT BY PRIOR id = parent_id
OMG의 옵션에 따라 다른 옵션을 편집합니다(단, 이 옵션은 동일하게 동작합니다).
select
t1.id,
t1.parent_id,
t1.name,
t2.name AS parent_name,
t2.id AS parent_id
from
(select id, parent_id, name
from tbl
start with id = 1
connect by prior id = parent_id) t1
left join
tbl t2 on t2.id = t1.parent_id
조금 번거로운 면이 있지만, (추가 가입이 없어도) 될 것 같습니다.이는 해당 필드에 나타나지 않는 문자를 구분자로 선택할 수 있음을 전제로 합니다.
셀렉트를 네스트하지 않고 실행할 수 있지만 SYS_CONNECT_에 대한 참조가 4개 있는 것이 조금 더 명확합니다.BY_PATH.
select id,
parent_id,
case
when lvl <> 1
then substr(name_path,
instr(name_path,'|',1,lvl-1)+1,
instr(name_path,'|',1,lvl)
-instr(name_path,'|',1,lvl-1)-1)
end as name
from (
SELECT id, parent_id, sys_connect_by_path(name,'|') as name_path, level as lvl
FROM tbl
START WITH id = 1
CONNECT BY PRIOR id = parent_id)
언급URL : https://stackoverflow.com/questions/2319284/sql-recursive-query-on-self-referencing-table-oracle
반응형
'programing' 카테고리의 다른 글
| WordPress - 플러그인 클래스에 정의된 제거 작업 (0) | 2023.03.05 |
|---|---|
| MUI에서 활성 탭 색상을 변경하는 방법 (0) | 2023.03.05 |
| Angularjs - 현재 날짜 표시 (0) | 2023.03.05 |
| Angular 2의 특정 루트에 대해 RouteReuseStrategy shouldDetach를 구현하는 방법 (0) | 2023.03.05 |
| 농담 모의 반응 컨텍스트 (0) | 2023.03.05 |