본문 바로가기
카테고리 없음

PostgreSQL - Recursive Query

by 이청춘아 2013. 9. 23.


  • Recursive Query 중 WHERE parent IS NULL 부분에 NULL이 아닌 값이 들어갈 경우 문제가 되는것 같다. 왜 그러는지는 아직 이해가 안됨.(이유가 있게지요...)
  • Recursive Query 를 보면 알겠지만, 사실상 별도의 레벨 컬럼이 필요 없다.
  • 포스팅하면서 쿼리나 컬럼명 등 수정해서 올린거라 보기가 참 그럼...(-_-!!)



[테이블 생성]

CREATE TABLE facility
(
  cd character(20) NOT NULL,			-- 코드
  nm text NOT NULL,				-- 명
  level numeric(1,0) NOT NULL,			-- 레벨(위 쿼리에서는 사실상 필요 없음.)
  parent character(20) DEFAULT NULL,		-- 상위코드
  alias_nm character(40), 			-- 디스플레이명
  CONSTRAINT facility_pkey PRIMARY KEY (cd)
 )


[샘플 데이터 저장]

INSERT INTO facility( cd,     nm,      level, parent, alias_nm )
	     VALUES ('0000',  '건물',  0,     null,   '건물명');
INSERT INTO facility( cd,     nm,      level, parent, alias_nm )
	     VALUES ('0001',  '1층',   1,     '0000',   '1층 명');
INSERT INTO facility( cd,     nm,      level, parent, alias_nm )
	     VALUES ('0002',  '2층',   1,     '0000',   '2층 명');
INSERT INTO facility( cd,     nm,      level, parent, alias_nm )
	     VALUES ('0003',  '3층',   1,     '0000',   '3층 명');
INSERT INTO facility( cd,     nm,      level, parent, alias_nm )
	     VALUES ('0004',  '101호', 2,     '0001',   '101호 명');
INSERT INTO facility( cd,     nm,      level, parent, alias_nm )
	     VALUES ('0005',  '102호', 2,     '0001',   '102호 명');
INSERT INTO facility( cd,     nm,      level, parent, alias_nm )
	     VALUES ('0006',  '201호', 2,     '0002',   '201호 명');
INSERT INTO facility( cd,     nm,      level, parent, alias_nm )
	     VALUES ('0007',  '301호', 2,     '0003',   '301호 명');


[Recursive Query]

WITH RECURSIVE tb_result( lv, path, cd, nm, level, parent ) AS
(
	SELECT	0, nm, cd, nm, level, parent
	FROM	facility
	WHERE	parent IS NULL
	UNION ALL
	SELECT	b.lv+1, path || ' > ' || a.nm, a.cd, a.nm, a.level, a.parent
	FROM	facility AS a JOIN tb_result AS b
		ON a.parent = b.cd
)
SELECT	 lv, path, cd, nm, level, parent
FROM	 tb_result
ORDER BY path

댓글