델파이코딩_개발일지

PL/SQL 계층형 쿼리문으로 TREELIST 계층 구조 만들기

천재메기 2023. 2. 21. 17:45

* 쿼리문 구조 참고한 사이트 : https://tragramming.tistory.com/82

 

[Oracle] 계층형 쿼리 - START WITH ~ CONNECT BY 구문

오라클의 계층형 쿼리와 대표적인 계층형 쿼리 구문인 START~WITH 구문에 대해 이야기해보고자 한다. 먼저 계층형 쿼리가 무엇인지에 대해 알아본다. 계층형 쿼리? - 한 테이블에 담겨 있는 여러 레

tragramming.tistory.com

우리가 쓸 쿼리문은 START WITH CONNECT BY ~ PRIOR 구문이다.

select * from dep_info 
start with UP_DEP_ID is null
connect by UP_DEP_ID = PRIOR DEP_ID

UP_DEP_ID = 상위 부서 코드 

DEP_ID = 부서 코드

procedure TForm5.btn_load1Click(Sender: TObject);
var
  Node : TCxTreeListNode;

begin
  treelist1.Clear;

  with qry_dep do
  begin
    Close;
    SQL.Clear;
    SQL.Add('SELECT * FROM DEP_INFO');
    SQL.Add('START WITH UP_DEP_ID IS NULL'); // 부모컬럼은 널값으로 시작하는 최상위 데이터를 갖고
    SQL.Add('CONNECT BY UP_DEP_ID = PRIOR DEP_ID'); // PRIOR 위치대로, 위에서 아래로 넓어지는 구조
    Open; // 위 쿼리문은 계층형 구조를 불러오는 쿼리문 (부모 / 자식 계층이 있는 데이터)
    First; // 포커스 위치 조정 

    while not eof do
    begin
      if FieldByName('UP_DEP_ID').IsNull then //상위부서코드가 널이면
      begin
        Node := treelist1.Add; // 노드를 추가하기
        with Node do
        begin
          Values[0] := FieldByName('DEP_ID').AsString; //쿼리의 값을 불러오자, 스트링으로
          Values[1] := FieldByName('UP_DEP_ID').AsString;
        end;
      end
      else
      begin // 아래는 텍스트로(상위노드값,위치) 노드를 찾아와서, 노드를 생성해주고 
        Node := treelist1.FindNodeByText(FieldByName('UP_DEP_ID').AsString, TreelistCol1);
        if Node <> NIL then //노드가 비어있다면 거기에 하위 노드를 만들어준다는 것
        begin
          with Node.AddChild do
          begin 
            Values[0] := FieldByName('DEP_ID').AsString;
            Values[1] := FieldByName('UP_DEP_ID').AsString;
          end;
        end;
      end;
      next;
    end;

    treelist1.FullExpand;//불러오자마자 닫혀있었던 게층들을 쭉 펴주자!
  end;



end;