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
운영게시판
최근게시물
PostgreSQL Q&A 10102 게시물 읽기
No. 10102
오라클->Postgresql WITH RECURSIVE로 변환하는 방법문의
작성자
김성훈
작성일
2019-08-22 12:18:11ⓒ
2019-08-22 13:34:57ⓜ
조회수
310

아래와 같은 오라클 쿼리인데 이걸 PostgreSQl  WITH RECURSIVE로 변경해야 하는데 어떻게 하는지 전혀 모르겠습니다.
어떻게 하면 될런지요?

SELECT a. C_CODE

              , a. C_NAME, a. UP_C_CODE, a.DESC, a. DEPT_LEVEL 

              , substr(sys_connect_by_path(c_name, '>'), 4) as F_PATH

FROM  C_MGT a

WHERE (DEL_YN IS NULL OR DE_YN != '1')
    AND C_TYPE = 'ABC'
    AND SUB_CODE = 'GGGGG'

    AND connect_by_isleaf = 1

START WITH F_TYPE = 'PP01'

CONNECT BY PRIOR C_CODE  = UP_C_CODE

 AND (DEL_YN  is null or DEL_YN != '1')

ORDER SIBLINGS BY to_number(DEPT_SEQ)

>> PostgreSQL로 

 

 

 

    

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

 이런 데이터가 있는데, 

오라클에서 이렇게 쿼리를 하면, 

이렇게 나온다. 

이걸 PostgreSQL에서 with recursive 쿼리로 이렇게 짜 보았는데, 결과가 이상하다, 

이 문제를 어떻게 풀면 좋겠는가?

 

이렇게 질문하셔야 원하는 답을 얻으실 수 있을 것 같습니다.

 

김상기(ioseph)님이 2019-08-22 12:34:58에 작성한 댓글입니다.

-------------------------------------------------------------------------------------

 

-- 기본로직

-------------------------------------------------------------------------------------

WITH RECURSIVE REC_TEMP(LEVEL) AS

(

 SELECT 1 AS LEVEL

   FROM DUAL

  UNION ALL

 SELECT LEVEL + 1

   FROM REC_TEMP RT

  WHERE 1 = 1

    AND LEVEL < 100

)

SELECT *

  FROM REC_TEMP

 WHERE 1 = 1

;


-- 하위조직을 찾는데 1개씩 있는조직이다. 1:N 이 아님

WITH RECURSIVE INCLUDED_PARTS(SUB_PART, PART, QUANTITY) AS

(

SELECT SUB_PART

     , PART

     , QUANTITY

  FROM PARTS

 WHERE 1 = 1

   AND PART = 'OUR_PRODUCT'

 UNION ALL

SELECT P.SUB_PART

     , P.PART

     , P.QUANTITY

  FROM INCLUDED_PARTS PR

     , PARTS P

 WHERE 1 = 1

   AND P.PART = PR.SUB_PART

)

SELECT SUB_PART

     , SUM(QUANTITY) AS TOTAL_QUANTITY

  FROM INCLUDED_PARTS

 GROUP BY SUB_PART

;


-- 노 cycle 옵션을 주기

WITH RECURSIVE SEARCH_GRAPH(ID, LINK, DATA, DEPTH, PATH, CYCLE) AS

(

 SELECT G.ID

      , G.LINK

      , G.DATA

      , 1

      , ARRAY[G.ID]

      , FALSE

    FROM GRAPH G

   WHERE 1 = 1

   UNION ALL

  SELECT G.ID

       , G.LINK

       , G.DATA

       , SG.DEPTH + 1

       , PATH || G.ID

       , G.ID = ANY(PATH)

    FROM GRAPH G

       , SEARCH_GRAPH SG

   WHERE 1 = 1

     AND G.ID = SG.LINK

     AND NOT CYCLE

)

SELECT *

  FROM SEARCH_GRAPH

 WHERE 1 = 1

;


-- 두개 이상의 컬럼으로 NO CYCLE 체크하기

WITH RECURSIVE SEARCH_GRAPH(ID, LINK, DATA, DEPTH, PATH, CYCLE) AS

(

SELECT G.ID

     , G.LINK

     , G.DATA

     , 1

     , ARRAY[ROW(G.F1, G.F2)]

     , FALSE

  FROM GRAPH G

 WHERE 1 = 1

 UNION ALL

SELECT G.ID

     , G.LINK

     , G.DATA

     , SG.DEPTH + 1

     , PATH || ROW(G.F1, G.F2)

     , ROW(G.F1, G.F2) = ANY(PATH)

  FROM GRAPH G

     , SEARCH_GRAPH SG

 WHERE 1 = 1

   AND G.ID = SG.LINK

   AND NOT CYCLE

)

SELECT *

  FROM SEARCH_GRAPH

 WHERE 1 = 1


;



박성재(yamayama)님이 2019-10-30 20:42:44에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
10105windows10에 postgresql 설치 후... [1]
전상도
2019-09-25
207
10104우분투(Ubuntu) 리눅스에 PostgreSQL설치시 pgdata(data_directory)경로변경하여 설치하는 방법 문의 [1]
황동현
2019-09-04
249
10103dump/restore로 테이블들을 재작성 하고 있습니다만. [1]
ohworld5
2019-08-26
235
10102오라클->Postgresql WITH RECURSIVE로 변환하는 방법문의 [2]
김성훈
2019-08-22
310
10101Master -> Slave 서버로 전환되는 조건 [2]
뿔보
2019-08-21
362
10099pgadmin4 질문입니다. [2]
나그네
2019-08-08
324
10098pl/pgsql C 라이브러리이용 함수 만들기 에러 문의 [3]
lucky
2019-08-07
296
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2019 DSN, All rights reserved.
작업시간: 0.122초, 이곳 서비스는
	PostgreSQL v11.5로 자료를 관리합니다