Database&Jpa

[DB] WITH AS 구문 사용하기

향각산 2024. 7. 25. 20:57

WITH AS 구문

WITH 구문은 공통 테이블 식(Common Table Expression, CTE) 을 정의하는 데 사용된다.

이는 임시적인 결과 집합을 정의하고, 이를 쿼리의 다른 부분에서 참조할 수 있게 해준다.

WITH는 뷰(View)와 유사하지만, CTE는 임시적이며 쿼리 내에서만 사용가능하다.

뷰와 달리 생성해주고 삭제해주지 않아도 된다.

 

 

단일 사용하기

예를 들어, 다음과 같이 서브쿼리 결과를 WHERE 안에 사용하고 싶을때 사용한다.

SELECT * FROM ITEM WHERE ID IN (SELECT ITEM_ID FROM ORDER ORDER BY CREATED_AT DESC LIMIT 200);

 

해당 쿼리는 서브쿼리에 limit 200이 들어가기 때문에 실행되지 않는다.

그렇다고 ITEM을 CREATED_AT DESC LIMIT 200; 으로 조회하면 아마 의도한 결과와 다른 값이 나올것이다.

해결방법은 ID를 뽑아서 WHERE에 직접 넣어도 되고, 뷰를 만들어도 된다.

ID를 뽑으면 직접 WHERE에 붙여넣기를 해야하고 뷰를 만들면 생성하고 삭제해줘야 하기 때문에 불편하다.

가장 간단한 방법은 다음과 같다.

WITH ITEM_IDS AS (
    SELECT ITEM_ID
    FROM ORDER
    ORDER BY CREATED_AT DESC
    LIMIT 200
)
SELECT * FROM ITEM WHERE ID IN (SELECT ITEM_ID FROM ITEM_IDS);

 

 

다중 조건 사용하기

만약 조건이 여러번 필요하다면 다음과 같이 작성할 수 있다.

WITH ITEM_IDS AS (
    SELECT ITEM_ID
    FROM ORDER
    ORDER BY CREATED_AT DESC
    LIMIT 200
),
    CATEGORY_IDS AS (
    SELECT CATEGORY_ID
    FROM ITEM
    WHERE ID IN (SELECT ITEM_ID FROM ITEM_IDS)
    )
SELECT * FROM CATEGORY WHERE ID IN (SELECT CATEGORY_ID FROM CATEGORY_IDS);

 

두번째 사용할때는 WITH를 추가하지 않고 쉼표를 찍고 작성해야 한다.

 

'Database&Jpa' 카테고리의 다른 글

[DB] EntityManager Multirow Insert  (0) 2024.07.30
Mysql GenerationType.AUTO 에러  (1) 2023.11.09
Mongodb 다운로드  (0) 2022.08.02
expected "identifier"; SQL statement:  (0) 2021.12.28
[MariaDB] 한글 깨짐  (0) 2020.09.11
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
글 보관함