자녀가 있는지 확인하기 위해 계층 적 관계에 대한 테이블을 변경하고 업데이트하는 절차

StackOverflow https://stackoverflow.com/questions/2470543

문제

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을 반환합니다.

나는 당신이 아마도 분석 기능과 수준의 의사 콜럼을 영리하게 사용하여 정확한 수의 어린이를 얻을 수 있다고 생각하지만 확실하지 않습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top