자녀가 있는지 확인하기 위해 계층 적 관계에 대한 테이블을 변경하고 업데이트하는 절차
-
20-09-2019 - |
문제
Oracle PL/SQL에 계층 적 테이블이 있습니다. 같은 것 :
create table hierarchical (
id integer primary key,
parent_id references hierarchical ,
name varchar(100));
그 테이블을 변경하기위한 절차를 만들어야하므로 각 노드에 대해 어린이가 있든 없든지 알려주는 새로운 필드를 얻을 수 있습니다.
하나의 단일 프로 시저에서 변경 및 업데이트를 수행 할 수 있습니까? 모든 코드 샘플은 대단히 감사 할 것입니다.
감사
해결책
당신은 할 수 없습니다 ALTER TABLE
(DDL) 그리고 UPDATE
(DML) 단일 단계에서.
당신은해야 할 것입니다 ALTER TABLE
, 그 뒤에 UPDATE
.
BEGIN
EXECUTE IMMEDIATE 'ALTER TABLE hierarchical ADD child_count INTEGER';
--
EXECUTE IMMEDIATE '
UPDATE hierarchical h
SET child_count = ( SELECT COUNT(*)
FROM hierarchical h2
WHERE h2.parent_id = h.id )';
END;
그래도이 작업을 수행하기 전에 두 번 생각하십시오. 당신은 지금 쉽게 찾을 수 있습니다 id
쿼리가있는 어린이가 있습니다.
이것은 예를 들어 모든 상단 노드의 보육을 제공합니다.
SELECT h.id, h.name, COUNT(childs.id) child_count
FROM hierarchical h
LEFT JOIN hierarchical childs ON ( childs.parent_id = h.id )
WHERE h.parent_id IS NULL
GROUP BY h.id, h.name
중복 데이터가있는 추가 열을 추가하면 자식을 추가/제거 할 때 항상 부모를 업데이트해야하므로 데이터 변경이 더 어려워집니다.
다른 팁
어린이가 있는지 여부를 알아야하는 경우 다음 쿼리는 루프 나 탈피 된 열없이 수행 할 수 있습니다.
select h.*, connect_by_isleaf as No_children_exist
from hierarchical h
start with parent_id is null
connect by prior id = parent_id;
connect_by_leaf는 행에 자녀가있는 경우 0을 반환합니다.
나는 당신이 아마도 분석 기능과 수준의 의사 콜럼을 영리하게 사용하여 정확한 수의 어린이를 얻을 수 있다고 생각하지만 확실하지 않습니다.
제휴하지 않습니다 StackOverflow