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 7090 게시물 읽기
No. 7090
오라클의 sys_connect_by_path 함수 변환
작성자
초보
작성일
2017-08-30 22:19
조회수
3,166

안녕하세요. 오라클DB 에서 MS-SQL 로 변환 중인데요.

CODE_MASTER 라는 테이블의 구조가 부모키로 연결된 테이블 입니다.

CODE_MASTER 의 테이블 데이터가 아래와 같습니다.

MASTER_ID   MASTER_NAME    UPPER_MASTER_ID     MASTER_LEVEL
1           1레벨 데이터                                                                  1
2           2레벨 데이터                      1                                          2
3           3레벨 데이터                       2                                          3
4           4레벨 데이터                       3                                         4
5           1-1레벨 데이터                                                               1
6           1-2레벨 데이터                    5                                         2
7           1-3레벨 데이터                    6                                         3
8           1-4레벨 데이터                   7                                          4

이렇게 데이터가 되어 있다고 가정 하고 기존  오라클은 sys_connect_by_path 라는 함수를 통해

데이터를 ( 1레벨 데이터>2레벨 데이터>4레벨 데이터>4레벨 데이터 ) 붙여서

구해왔는데 MS-SQL 로 변환 하였을 경우 어떻게 해야 하는지 궁금해서 문의 드립니다.

SELECT x.MASTER_ID
     ,MASTER_NAME    
     ,sys_connect_by_path(x.MASTER_NAME, '>')
     ,regexp_substr(sys_connect_by_path(x.MASTER_NAME, '>'),'[^>]+',1,1) as master_common_lv1
     ,regexp_substr(sys_connect_by_path(x.MASTER_NAME, '>'),'[^>]+',1,2) as master_common_lv2
     ,regexp_substr(sys_connect_by_path(x.MASTER_NAME, '>'),'[^>]+',1,3) as master_common_lv3
     ,regexp_substr(sys_connect_by_path(x.MASTER_NAME, '>'),'[^>]+',1,4) as master_common_lv4
     ,regexp_substr(sys_connect_by_path(x.MASTER_NAME, '>'),'[^>]+',1,5) as master_common_lv5
FROM  CODE_MASTER x
where  x.UPPER_MASTER_ID is not null
CONNECT BY PRIOR x.MASTER_ID = x.UPPER_MASTER_ID
START  WITH x.MASTER_LEVEL = 1

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

WITH code_master(master_id, master_name, upper_master_id, master_level) AS
(
          SELECT 1, '1레벨 데이터'  , null, 1
UNION ALL SELECT 2, '2레벨 데이터'  ,    1, 2
UNION ALL SELECT 3, '3레벨 데이터'  ,    2, 3
UNION ALL SELECT 4, '4레벨 데이터'  ,    3, 4
UNION ALL SELECT 5, '1-1레벨 데이터', null, 1
UNION ALL SELECT 6, '1-2레벨 데이터',    5, 2
UNION ALL SELECT 7, '1-3레벨 데이터',    6, 3
UNION ALL SELECT 8, '1-4레벨 데이터',    7, 4
)
, t AS
(
SELECT master_id
     , master_name
     , upper_master_id
     , master_level
     , CAST(master_name AS VARCHAR(100)) AS master_path
     , master_name                AS master_common_lv1
     , CAST(null AS VARCHAR(100)) AS master_common_lv2
     , CAST(null AS VARCHAR(100)) AS master_common_lv3
     , CAST(null AS VARCHAR(100)) AS master_common_lv4
     , CAST(null AS VARCHAR(100)) AS master_common_lv5
     , CAST(RIGHT(CONCAT('00', master_id), 3) AS VARCHAR(20)) AS master_ord
  FROM code_master
 WHERE master_level = 1
 UNION ALL
SELECT b.master_id
     , b.master_name
     , b.upper_master_id
     , b.master_level
     , CAST(a.master_path + '>' + b.master_name AS VARCHAR(100)) master_path
     , a.master_common_lv1
     , CASE b.master_level WHEN 2 THEN b.master_name ELSE a.master_common_lv2 END master_common_lv2
     , CASE b.master_level WHEN 3 THEN b.master_name ELSE a.master_common_lv3 END master_common_lv3
     , CASE b.master_level WHEN 4 THEN b.master_name ELSE a.master_common_lv4 END master_common_lv4
     , CASE b.master_level WHEN 5 THEN b.master_name ELSE a.master_common_lv5 END master_common_lv5
     , CAST(CONCAT(a.master_ord, RIGHT(CONCAT('00', b.master_id), 3)) AS VARCHAR(20)) AS master_ord
  FROM t a
 INNER JOIN code_master b
    ON a.master_id = b.upper_master_id
)
SELECT *
  FROM t
 WHERE upper_master_id IS NOT NULL
 ORDER BY master_ord
;

마농(manon94)님이 2017-08-31 10:55에 작성한 댓글입니다.
이 댓글은 2017-08-31 10:58에 마지막으로 수정되었습니다.
[Top]
No.
제목
작성자
작성일
조회
7093행별 총합, sub sum, 열끝에는 sum을.. 출력 도움 부탁드립니다~ [2]
개발자
2017-09-18
2668
7092페이징 쿼리 입니다. 찾다 찾다 그냥 만들었습니다 [2]
박성재
2017-09-08
2605
7091MSSQL2008 DB를 Paradox파일로 백업하는 쿼리가 있나요?
김우성
2017-09-03
2418
7090오라클의 sys_connect_by_path 함수 변환 [1]
초보
2017-08-30
3166
7089sql 입니다. 꼭 부탁 드려요... [1]
도와주세요
2017-08-29
2483
7088다른유형의 레코드형태를 어떻게 빨리 조회할 수 있을까요?
권순환
2017-08-23
2375
7087row 를 늘리기 도움 부탁드립니다. [4]
개발자
2017-08-23
2601
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2023 DSN, All rights reserved.
작업시간: 0.049초, 이곳 서비스는
	PostgreSQL v16.1로 자료를 관리합니다