집계쿼리에 조인할 테이블이 많은 경우
먼저 집계한 다음에 조인하자!
기존
SELECT A.prodType, A.ctgryCd1, A.ctgryCd2, A.ctgryCd3
, B.code_nm AS prodTypeNm
, (SELECT ctgryNm FROM t_info WHERE ctgryId = A.ctgryCd1 AND useYn = 'Y') AS ctgryNm1
, (SELECT ctgryNm FROM t_info WHERE ctgryId = A.ctgryCd2 AND useYn = 'Y') AS ctgryNm2
, (SELECT ctgryNm FROM t_info WHERE ctgryId = A.ctgryCd3 AND useYn = 'Y') AS ctgryNm3
, COUNT(A.seqNo) AS csSum
FROM t_list A INNER JOIN t_code B ON A.prodType = B.`code`
INNER JOIN t_info C ON A.cUserId = C.userId
LEFT OUTER JOIN t_hp D ON A.hp_Code = D.hp_Code
WHERE 1=1
AND A.delYn = 'N'
GROUP BY A.prodType, A.ctgryCd1, A.ctgryCd2, A.ctgryCd3
;
수정
SELECT A.*
, B.code_nm AS prodTypeNm
, C.ctgryNm AS ctgryNm1
, D.ctgryNm AS ctgryNm2
, E.ctgryNm AS ctgryNm3
FROM (
SELECT prodType, ctgryCd1, ctgryCd2, ctgryCd3, COUNT(seqNo) AS csAggr
FROM t_list
WHERE delYn = 'N'
GROUP BY prodType, ctgryCd1, ctgryCd2, ctgryCd3
) A
INNER JOIN t_code B ON A.prodType = B.`code`
INNER JOIN t_info C ON A.ctgryCd1 = C.ctgryId AND C.useYn = 'Y'
INNER JOIN t_info D ON A.ctgryCd2 = D.ctgryId AND D.useYn = 'Y'
LEFT JOIN t_info E ON A.ctgryCd3 = E.ctgryId AND E.useYn = 'Y'
;
배운점
GROUP BY
- GROUP BY에 정의한 내용(컬럼 또는 변형된 컬럼)만 SELECT절에 그대로 사용할 수 있다.
- GROUP BY에 정의하지 않은 컬럼을 SELECT절에서 사용하려면 반드시 집계함수 처리를 해야 한다.
- GROUP BY에 없는 컬럼을 집계함수 없이 사용하면, MySQL이 아닌 다른 DBMS에서는 실행 자체가 되지 않는다.
- MySQL은 결과값을 임의 처리한 SQL이 실행되므로 데이터에 오류가 있어도 감지하지 못하는 경우가 생길 수 있다.
- MySQL에서도 실행되지 않게 하려면 SQL_MODE를 변경하면 된다.
SELECT @@SQL_MODE;
- SQL_MODE 값에 'ONLY_FULL_GROUP_BY'를 추가해서 SQL_MODE를 다시 설정하면 GROUP BY에 없는 항목이 집계함수 없이 SELECT절에서 사용되는 것을 막을 수 있다.
# 현재 설정된 SQL_MODE에 ONLY_FULL_GROUP_BY를 추가해서 설정 SET SESSION SQL_MODE = CONCAT('ONLY_FULL_GROUP_BY,',@@SQL_MODE);
- SQL_MODE를 이전으로 되돌리고 싶다면 'SELECT @@SQL_MODE;'를 다시 실행해 얻은 결과에서 'ONLY_FULL_GROUP_BY'를 제거한 값을 SQL_MODE로 재설정하면 된다.
SET SESSION SQL_MODE;
- SQL_MODE 값에 'ONLY_FULL_GROUP_BY'를 추가해서 SQL_MODE를 다시 설정하면 GROUP BY에 없는 항목이 집계함수 없이 SELECT절에서 사용되는 것을 막을 수 있다.
ref)
4.09.4 GROUP BY 사용 규칙
#### 4.9.4 GROUP BY 사용 규칙 GROUP BY는 GROUP BY에 정의한 내용(컬럼 또는 변형된 컬럼)만 SELECT절에 그대로 사용할 수 있다. GROUP B…
wikidocs.net
'개발 한 스푼 > MySQL' 카테고리의 다른 글
Mysql 숫자함수 (ABS, CEILING, FLOOR, ROUND, TRUNCATE) (0) | 2024.03.13 |
---|---|
you do not have the SUPER privilege (Error Code: 1419) (0) | 2023.09.20 |
NOW()와 SYSDATE()의 차이 (0) | 2023.09.05 |
계층형 쿼리 (0) | 2023.08.17 |
[MySQL] YEAR_MONTH() 현재 연도, 월 알아내기 (0) | 2023.07.17 |