database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
Oracle
Informix
Sybase
ㆍMS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
MS-SQL Q&A 6845 게시물 읽기
No. 6845
쿼리질문 드립니다.
작성자
고재원(jwko)
작성일
2014-09-02 13:38
조회수
6,866

pk_id depth foldername

15 0 프로그램

16 0 .

17 0 .

18 15 컴퓨터

19 15 .

20 18 .

21 18 .

22 18 .

23 18 AutoCAD

. . .

. . .

34 23 IPP

 

대략 이런형태의 TREE구조 폴더가 있는 경우 선택한 폴더의 전체 경로를 알고 싶습니다.

가장 하단에 선택한 폴더에서 상위 폴더를 찾아 화면에 출력하고 싶습니다.

 

예) 가장 하단의 폴더가 IPP일 경우

원하는 결과 : 프로그램>컴퓨터>AutoCAD>IPP

 

사용자가 IPP 폴더를 선택한 경우

select문에 pk_id값을 받아 depth와 foldername값을 알수 있습니다.

IPP의 depth = 23이며, db에서 pk_id가 23인걸 조회하면 다시 depth값을 알수 있는데

이걸 어떻게 쿼리를 해야 할지..

이 글에 대한 댓글이 총 3건 있습니다.

WITH treeTbl ( pk_id, depth, foldername )

AS
(
SELECT  15, 0 , N'프로그램'
UNION ALL SELECT 16, 0 , N'.'
UNION ALL SELECT 17, 0 , N'.'
UNION ALL SELECT 18, 15, N'컴퓨터'
UNION ALL SELECT 19, 15, N'.'
UNION ALL SELECT 20, 18, N'.'
UNION ALL SELECT 21, 18, N'.'
UNION ALL SELECT 22, 18, N'.'
UNION ALL SELECT 23, 18, N'AutoCAD'
UNION ALL SELECT 34, 23, N'IPP'
)
, cteTbl ( pk_id, depth, foldername, pathIvtLvl )
AS
(
SELECT aa.pk_id, aa.depth, aa.foldername, 0
FROM treeTbl AS aa
WHERE pk_id = 34
UNION ALL
SELECT aa.pk_id, aa.depth, aa.foldername, pathIvtLvl + 1
FROM treeTbl AS aa
INNER JOIN cteTbl AS bb
ON aa.pk_id = bb.depth
)
SELECT *,
STUFF( REPLACE( 
(
SELECT N'>' + foldername AS [text()] 
FROM cteTbl
ORDER BY pathIvtLvl DESC
FOR XML PATH('')
), N'>', N'>' 
), 1, 1, N'' )
FROM cteTbl
WHERE pk_id = 34
;
 
우욱님이 2014-09-02 15:16에 작성한 댓글입니다. Edit

혹시 CTE가 단박에 이해되지 않으시면 

http://blog.naver.com/uook_/130134813052

참조해 보세요

우욱님이 2014-09-02 15:25에 작성한 댓글입니다. Edit

WITH  treeTbl (pk_id, depth, foldername) AS
(
SELECT 15, 0, '프로그램'
UNION ALL SELECT 16,  0, '.'
UNION ALL SELECT 17,  0, '.'
UNION ALL SELECT 18, 15, '컴퓨터'
UNION ALL SELECT 19, 15, '.'
UNION ALL SELECT 20, 18, '.'
UNION ALL SELECT 21, 18, '.'
UNION ALL SELECT 22, 18, '.'
UNION ALL SELECT 23, 18, 'AutoCAD'
UNION ALL SELECT 34, 23, 'IPP'
)
, cteTbl (id, pk_id, depth, folderPath) AS
(
SELECT pk_id AS id
     , pk_id
     , depth
     , CAST(foldername AS VARCHAR(1000)) folderPath
  FROM treeTbl
 WHERE pk_id = 34
 UNION ALL
SELECT c.id
     , p.pk_id
     , p.depth
     , CAST(p.foldername + '>' + c.folderPath AS VARCHAR(1000)) folderPath
  FROM cteTbl c
 INNER JOIN treeTbl p
    ON p.pk_id = c.depth
)
SELECT id
     , folderPath
  FROM cteTbl
 WHERE depth = 0
;

마농(manon94)님이 2014-09-02 15:25에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
6848조건이 1인것과 0인것 구별해서 합계내기 [1]
김우성
2014-09-06
6080
6847select -> update 문으로 바꾸기 [3]
김우성
2014-09-03
6532
6846MDB UPDATE시 문자열 내에 있는 아포스트로피( ' ) [1]
전일동
2014-09-03
6407
6845쿼리질문 드립니다. [3]
고재원
2014-09-02
6866
684450 단위로 맞추기 [5]
김우성
2014-08-31
6318
6843성능모니터
아이들
2014-08-26
5747
6842select 후 값이 있으면 update 없으면 insert 에 대한 문의드립니다.
다키짱
2014-08-22
7204
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.048초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다