이건 진짜 그냥 몰라서 어캐 푸는지 처음부터 봤음
처음 보는 유형 + 처음 보는 함수가 너무 많아서 아래에서 서술하도록 하겠음
DECLARE @max INT = 1000;
WITH Numbers AS (
SELECT 2 AS Num
UNION ALL
SELECT Num + 1
FROM Numbers
WHERE Num + 1 <= @max
),
Primes AS (
SELECT Num
FROM Numbers N
WHERE NOT EXISTS (
SELECT 1
FROM Numbers D
WHERE D.Num < N.num AND N.Num % d.Num = 0
)
)
SELECT STRING_AGG(CAST(Num AS VarCHAR), '&') AS PrimeNumbers
FROM Primes
OPTION (MAXRECURSION 1000);
DECLARE @max INT = 50;DECLARE: SQL에서 변수를 선언할 때 사용하는 키워드
@max: 변수 이름
변수 이름 앞에는 @를 붙여 SQL에서 변수를 나타냄
INT: 이 변수의 데이터 타입으로, 정수(Integer)를 의미
= 50: 변수에 초기값을 설정
여기서는 @max의 값을 50으로 설정
WITH Numbers AS (...)WITH: CTE(Common Table Expression)를 정의할 때 사용하는 키워드Numbers: 이 CTE의 이름AS (...): 이 이름(Numbers)을 정의할 때 실행할 쿼리를 괄호 안에 넣는다.SELECT 2 AS NumSELECT: 데이터를 선택하는 SQL 키워드 2: 고정된 값 2를 생성 AS Num: 이 값에 "Num"이라는 이름(별칭)을 붙인다.2)를 삽입FROM이 생략 가능하기 때문)Num
---
2UNION ALL SELECT Num + 1 FROM Numbers WHERE Num + 1 <= @maxUNION ALL: 두 개의 결과를 결합SELECT Num + 1: 기존 숫자(Num)에 1을 더한 값을 생성 FROM Numbers: 앞에서 정의된 Numbers CTE를 참조WHERE Num + 1 <= @max: 새로 생성된 숫자가 @max(50) 이하인지 확인하고 조건을 만족하지 않으면 값을 추가하지 않음.SELECT 2 AS Num 실행 → Numbers 테이블에 2가 저장됨Num
---
2SELECT Num + 1 FROM Numbers WHERE Num + 1 <= @maxNum이 2일 때: 2 + 1 = 3Num
---
2
3Num이 3일 때: 3 + 1 = 4Num
---
2
3
4Num 값이 1000이 될 때까지 반복.WITH Primes AS (...)Numbers CTE를 기반으로 소수를 필터링하는 또 다른 CTE를 만듦SELECT Num FROM Numbers nSELECT Num: Numbers CTE에서 Num 값을 가져오고 FROM Numbers n: Numbers CTE를 n이라는 별칭으로 참조WHERE NOT EXISTS (...)NOT EXISTS: 조건에 맞는 결과가 존재하지 않을 때만 true를 반환SELECT 1
FROM Numbers d
WHERE d.Num < n.Num AND n.Num % d.Num = 0
SELECT 1: 특정 값을 반환1만 반환FROM Numbers d: Numbers CTE를 d라는 별칭으로 참조WHERE d.Num < n.Num: d.Num이 n.Num보다 작은 숫자만 찾음. AND n.Num % d.Num = 0: n.Num이 d.Num으로 나누어떨어지는 숫자만 선택 n.Num보다 작은 숫자 중, n.Num을 나누어떨어지게 하는 숫자가 존재하면, n.Num은 소수가 아님.NOT EXISTS: 위 조건을 만족하는 숫자가 존재하지 않을 때만 n.Num을 소수로 간주SELECT STRING_AGG(CAST(Num AS VARCHAR), '&') AS PrimeNumbers FROM PrimesSELECT STRING_AGG(...): SQL Server의 함수로, 여러 값을 하나의 문자열로 결합 CAST(Num AS VARCHAR): 숫자 Num을 문자열로 변환'&': 값들을 결합할 때 사용하는 구분자 FROM Primes: 소수(Primes CTE)에서 값을 가져옴 @max = 50이라면 Primes CTE에는 다음 소수가 저장Num
---
2
3
5
7
11
13
...2&3&5&7&11&13&17&19&23&29&31&37&41&43&47DECLARE: 최대값(@max)을 설정WITH Numbers: 2부터 @max까지의 숫자를 생성WITH Primes: Numbers에서 소수만 필터링SELECT STRING_AGG: 소수들을 &로 연결된 문자열로 출력