일치하지 않거나 누락된 레코드를 찾아내자.
판매되지 않은 상품 찾아내기.
가장 쉬운방법은 서브쿼리로 판매된 제품목록을 구한 후, 전체 상품목록에서 판매된 제품 목록을 제외하는것(NOT IN)이다.
이 쿼리는 이해하기 쉽지만 실행계획이 효율적이지 않다.
왜냐하면, 서브쿼리에서 Order_Details 테이블 전체를 검색해 판매된 제품목록을 가져와서,
Products 테이블의 각 ProductNumber값을 하나,하나, 비교해야한다.
이보다 더 효율적인 방법이 있다. 서브쿼리가 적어도 하나의 열을 반환하는지 확인하는 EXISTS연산자를 사용하는것이다.
쿼리 엔진지 조건에 일치하는 레코드를 발견하면, 동일한 레코드에서는 이후 비교 작업을 더이상 진행하지 않기때문이다.
CASE로 문제를 해결할 때를 파악하자.
CASE는 알다시피, IF THEN ELSE문의 SQL 버전이라고 할 수 있다.
표현식을 사용하는 곳이라면, (SELECT 절, 검색 조건이 있는 WHERE나 HAVING절 등)에서 CASE를 사용 가능하다.
CASE문에서 NULL검사를 해야한다면 CASE문에서 WHEN절에서 NULLIF나 <표현식>IS NULL을 사용한다.
CASE문의 종류
- 단순형 CASE문
- 검색형 CASE문 : 값 표현식 두개 이상을 검사 하고 싶다면 검색형 CASE를 사용한다. 검색 조건이 있는 WHERE 절을 사용하면 된다.
CASE WHEN
(SELECT SUM(QuantityOrdered)
FROM Order_Details
WHERE Order_Details.ProductNumber =
Products.ProductNumber) <= 200
THEN 'Poor' --THEN에도 마찬가지로 표현식이 들어가므로, CASE 문을 사용 가능하다.
WHERE이나 HAVING 절의 조건식 일부로 CASE를 사용할 수 있지만 상대적으로 효율적이지 않다.
다중 조건 문제를 해결하는 기법
두 테이블의 JOIN 결과에 적용된 조건을 기준으로, 다른 테이블에 있는 행을 반환해야 할 때는 복잡해진다. 특히 복합 조건을 적용해야 할 때.
여러개의 조건을 모두 만족하는 쿼리 작성하기
- INNER JOIN 사용
서브쿼리에서 스케이트 보드를 구매한 고객의 고객번호를 구한 후, 그 결과와 다시 조인을 한다는 점이 인상깊다. - 4개의 서브쿼리와 WHERE, IN, AND 사용. 그리고 서브쿼리는 함수로 구현했다. 나는 이쪽이 좀 더 마음에 든다.
- EXISTS 사용
'Today I learned' 카테고리의 다른 글
2021 04 22 - SQL Booster : GROUP BY Holic (0) | 2021.04.22 |
---|---|
2021 04 16 (0) | 2021.04.16 |
2021 04 10 - sql Antipatterns (0) | 2021.04.10 |
2021 04 07 - sql Antipatterns 다형성 연관을 사용하는 테이블 (0) | 2021.04.07 |
2021 04 06 - sqlAntipatterns 두개 이상의 테이블이 거의 유사한 구조를 가질때 (0) | 2021.04.06 |
댓글