오라클 RECURSIVE 쿼리 문의 2 9 1,278

by 도겸아빠 [SQL Query] [2022.06.08 09:32:49]


안녕하세요.

recursive 쿼리 관련하여 문의 드립니다.

아래와 같은 입력이 있을 경우 결과와 같이 구분하여 데이터를 만들고 싶은데 redshift로 옮겨야 하는 상황이라 recursive 쿼리로 변경을해야 하는데 

고수님들의  도움이 필요하여 이렇게 글을 남깁니다.

참고로 redshift에서는 connect by가 지원되지 않아서 지원가능한 다른 쿼리로 전환이 필요합니다.

좋은 하루 되세요~

입력: SELECT 'A-B-C-D-E' as whole_itin FROM DUAL

결과:
A-B
B-C
C-D
D-E
A-C
A-D
A-E
B-D
B-E
C-E

 

by 마농 [2022.06.08 10:07:13]

입력값은 알파벳 1자리 고정인가요?


by 도겸아빠 [2022.06.08 10:11:20]

안녕하세요.

아래와 같은 샘플의 3자리 입니다.

ASR-LGG-ZAZ-JFK-ORD

ADD-DUB-LAX-BUR

ABE-ILN-DEN

감사합니다.


by 마농 [2022.06.08 10:15:25]
WITH copy_t AS
(
SELECT 1 lv FROM dual
UNION ALL SELECT 2 FROM dual
UNION ALL SELECT 3 FROM dual
UNION ALL SELECT 4 FROM dual
UNION ALL SELECT 5 FROM dual
UNION ALL SELECT 6 FROM dual
UNION ALL SELECT 7 FROM dual
UNION ALL SELECT 8 FROM dual
UNION ALL SELECT 9 FROM dual
)
, tmp AS
(
SELECT SUBSTR(whole_itin, lv * 4 - 3, 3) x
  FROM (SELECT 'ASR-LGG-ZAZ-JFK-ORD' whole_itin FROM dual) a
     , copy_t b
 WHERE lv <= (LENGTH(whole_itin) + 1) / 4
)
SELECT a.x ||'-'|| b.x x
  FROM tmp a
     , tmp b
 WHERE a.x < b.x
;

 


by 도겸아빠 [2022.06.08 10:23:52]

와~~

죄송한데 정렬 순서도 아래와 같이 정렬 가능할까요?

미리 감사합니다.

ASR-LGG
LGG-ZAZ
ZAZ-JFK
JFK-ORD
ASR-ZAZ
ASR-JFK
ASR-ORD
LGG-JFK
LGG-ORD
ZAZ-ORD


by 마농 [2022.06.08 10:26:21]
WITH copy_t AS
(
SELECT 1 lv FROM dual
UNION ALL SELECT 2 FROM dual
UNION ALL SELECT 3 FROM dual
UNION ALL SELECT 4 FROM dual
UNION ALL SELECT 5 FROM dual
UNION ALL SELECT 6 FROM dual
UNION ALL SELECT 7 FROM dual
UNION ALL SELECT 8 FROM dual
UNION ALL SELECT 9 FROM dual
)
, tmp AS
(
SELECT lv
     , SUBSTR(whole_itin, lv * 4 - 3, 3) x
  FROM (SELECT 'ASR-LGG-ZAZ-JFK-ORD' whole_itin FROM dual) a
     , copy_t b
 WHERE lv <= (LENGTH(whole_itin) + 1) / 4
)
SELECT a.x ||'-'|| b.x x
  FROM tmp a
     , tmp b
 WHERE a.lv < b.lv
 ORDER BY SIGN(b.lv - a.lv - 1), a.lv, b.lv
;

 


by 도겸아빠 [2022.06.08 10:36:30]

답변감사합니다.

순서가 잘 안맞는것 같은데 한번만 더 봐주실수 있을까요?

미리 감사드립니다.


by 마농 [2022.06.08 10:37:43]

ORDER BY 추가했어요.


by 도겸아빠 [2022.06.08 10:49:48]

SIGN함수를 저렇게 활용하는군요.

프로그램에 적용해보겠습니다.

감사합니다.


by 마농 [2022.06.08 14:19:33]
WITH copy_t AS
(
SELECT 1 lv FROM dual
UNION ALL SELECT 2 FROM dual
UNION ALL SELECT 3 FROM dual
UNION ALL SELECT 4 FROM dual
UNION ALL SELECT 5 FROM dual
UNION ALL SELECT 6 FROM dual
UNION ALL SELECT 7 FROM dual
UNION ALL SELECT 8 FROM dual
UNION ALL SELECT 9 FROM dual
)
SELECT SUBSTR(a.whole_itin, b.lv * 4 - 3, 3) ||'-'||
       SUBSTR(a.whole_itin, c.lv * 4 - 3, 3) x
  FROM (SELECT 'ASR-LGG-ZAZ-JFK-ORD' whole_itin FROM dual) a
     , copy_t b
     , copy_t c
 WHERE b.lv < c.lv
   AND c.lv <= (LENGTH(a.whole_itin) + 1) / 4
 ORDER BY SIGN(c.lv - b.lv - 1), b.lv, c.lv
;

 

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입