머릿 속으로 암산을 하다가 퍼뜩 SQL로 구구단을 출력해보고 싶어져 쿼리를 작성해 보았다..!
파이썬에는 for 문이 있지만 SQL에서는 LEVEL을 이용하면 된다.
우선 구구단은 기본적으로 A(단) * B(곱할수) 구조 이므로 LEVEL을 두 개 사용했다.
# 첫 시도
SELECT
LEVEL AS 단,
num AS 곱할수,
LEVEL * num AS 결과
FROM
(SELECT LEVEL AS num FROM DUAL CONNECT BY LEVEL <= 9),
DUAL
CONNECT BY LEVEL <= 9
ORDER BY 단, 곱할수;
처음엔 이렇게 쿼리를 작성하였으나 숫자값이 중복되어 출력되는 현상이 발생했다.
LEVEL과 num을 독립적으로 명시해주지 않았기 때문이다!
또한 CONNECT BY가 중첩되면서 조합이 중복적으로 생성된다.
1단부터 9단까지 오류 없이 출력되는 쿼리는 아래와 같다.
# 정상적으로 출력되는 쿼리
SELECT
A.lvl AS 단,
B.lvl AS 곱할수,
A.lvl * B.lvl AS 결과
FROM
(SELECT LEVEL AS lvl FROM DUAL CONNECT BY LEVEL <= 9) A
CROSS JOIN
(SELECT LEVEL AS lvl FROM DUAL CONNECT BY LEVEL <= 9) B
ORDER BY 단, 곱할수;
<수정 부분>
1. 그냥 조인이 아닌 CROSS JOIN으로 단과 곱할수를 독립적으로 만들어준다(9*9).
2. LEVEL은 예약어라서 별칭을 쓰지 못한다(A.LEVEL, B.LEVEL이라고 명시해주면 오류가 난다). 그래서 lvl이라는 컬럼 별칭을 따로 줘서 서로 다른 값으로 처리할 수 있게 한다.
3. FROM 절의 서브쿼리 2개에 LEVEL을 각각 넣어서 CONNECT BY가 서로 중첩되지 않게 했다.
파이썬을 처음 배울 때 구구단을 출력하는 것부터 시작했는데 SQL도 뽑아보니 새로운 느낌이었다 .. !
'Oracle > 공부' 카테고리의 다른 글
| [SQL] TO_CHAR(FM) 표기법(숫자 포맷) (1) | 2025.01.13 |
|---|---|
| [SQL] SQL의 실행 과정과 옵티마이저(Optimizer) (0) | 2025.01.11 |
| [SQL] MAX(COUNT())가 실행되지 않는 이유(집계함수, 윈도우함수) (1) | 2025.01.05 |
| [SQL] FROM 서브쿼리 별칭을 WHERE 서브쿼리에서 참조할 수 없는 이유 (2) | 2025.01.03 |
| [SQL] 다중 행 서브쿼리에서 ANY & ALL 연산자 사용 (1) | 2025.01.02 |