-
<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이 출력되게 된다
데이터 간의 상위 하위 관계를 설정하는 계층 쿼리는 데이터 내에서 계층 관계를 표시할 수 있게 해주는데
해당하는 부분에 대해서는 더 공부를 한 뒤 블로그에 작성하도록 하겠다.
- References
- https://www.geeksforgeeks.org/display-sequence-of-numbers-in-sql-using-level/ <Display sequence of number>
- https://docs.oracle.com/cd/B19306_01/server.102/b14200/queries003.htm <Oracle Help center>
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
- References