카테고리 없음

<SQL : Oralce> CONNECT BY LEVEL (with DUAL)

배또가또 2024. 1. 9. 14:47

지난 글에서는 MySQL에서 재귀쿼리를 통해 데이터를 반복문처럼 생성하는 방법에 대해서 알아보았다. 

MySQL 재귀쿼리 https://jinhyunbae.tistory.com/107

 

<SQL : MySQL> RECURSIVE(재귀 쿼리)

SQL을 하다보면 연속적인 숫자 데이터를 생성할 필요가 있을 수 있다. 이 때 프로그래밍이라면 반복문을 돌려서 쉽게 해결할 수 있는데 SQL에는 해당하는 기능이 없을까 SQL에서는 재귀 쿼리를 이

jinhyunbae.tistory.com

 

Oracle에서도 MySQL과 같이 WITH RECURSIVE를 제공하긴하지만

Orcle에서만 지원하는 LEVEL과 CONNECT BY를 이용해 WITH RECURSIVE처럼  구현하는 방법을 알아보았다.

 

출처 : geeksforgeeks.org

 

FROM 절을 보면 뜬금없이 DUAL이라는 이름의 테이블이 사용된 것을 확인할 수 있다. 

DUAL은 Oracle 데이터베이스가 데이터 사전과 함께 자동으로 생성하는 더미 테이블이다.

프로그래머스 실행 후 캡쳐

 

DUAL 테이블을 조회해보면 dummy라는 칼럼에 X라는 데이터 행 1개만 들어있는 것을 볼 수 있다. 

즉 최소한의 자원으로만 구성된 임시 테이블로, 이 테이블을 이용하면

원하는 수식의 계산이나 내장함수를 테이블 없이 실행하는 것이 가능하다. 

 

그리고 SELECT문에서의 LEVEL은 숫자 형식으로 계층을 식별하기 위해서 계층쿼리에서 사용되는 가상의 열이다.

LEVEL은 root행에 대해서 1을 부여하고 그 아래의 계층에 대해 2, 3, 4 이렇게 늘어난다(트리 구조)

마지막으로 CONNECT BY절은 오라클에서 지원하는 기능 중 하나로 

계층 구조에서 상위 행과 하위 행 계층간의 관계를 정의해주는 구문이다.

SELECT Level AS Sequence # LEVEL 1을 초기값으로 쿼리함
FROM Dual 
CONNECT BY Level <= 5 # 지정된 조건을 통과할 때 까지의 값을 표시함

 

위 사진의 코드를 해석하면 더미테이블인 Dual에서 초기값 1을 갖는 LEVEL을 가져오고 

쿼리에서 값이 1인 LEVEL과 지정된 조건 사이에 CONNECT BY를 사용해 관계를 생성한다.

이렇게 하는 것을 통해 지정된 조건을 통과할 때 까지의 값이 표시되게 된다. 

 

SELECT Level+5 AS Sequence 
FROM Dual 
CONNECT BY Level <= 5

레벨에 숫자를 바꾸는 것을 통해서 쉽게 응용을 할 수 있다. 위 처럼 코드를 짜면 6에서 10이 출력되게 된다

 

데이터 간의 상위 하위 관계를 설정하는 계층 쿼리는 데이터 내에서 계층 관계를 표시할 수 있게 해주는데

해당하는 부분에 대해서는 더 공부를 한 뒤 블로그에 작성하도록 하겠다.


 

Display Sequence of Numbers in SQL Using LEVEL - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

 

Hierarchical Queries

Hierarchical Queries If a table contains hierarchical data, then you can select rows in a hierarchical order using the hierarchical query clause: hierarchical_query_clause::= Description of the illustration hierarchical_query_clause.gif START WITH specifie

docs.oracle.com