해당 오류는 이름 그대로 서브쿼리에서 두 건 이상의 레코드가 조회될 때, 해당 오류가 발생한다.
대부분의 경우에 SELECT 절 또는 WHERE 절에서 서브쿼리를 사용했을 때, 해당 오류가 발생한다.
보통은 쿼리를 분석하다보면 쉽게 찾을 수 있는데, IN 절이나 GROUP_CONCAT 함수처럼
여러 값이 입력될 수 있는 구문에서 발생하는 오류는 찾기 어려울 수 있다.
다음은 해당 오류가 발생되는 예제다.
▼1
SELECT절에서 발생되는 오류
SELECT
(
SELECT X.ID
FROM COM_STUDENT X
WHERE X.GROUP = "MATH" AND X.USE='Y' ---> ERROR 1242
)
, B.SUBJECT_NAME
FROM COM_STUDENT A, COM_STUDENT_SUBJECT B
WHERE A.ID = B.STUDENT_ID
AND A.ID IN (
9
,8
)
AND A.USE = 'Y';
위 쿼리에서 그룹이 MATH이고, USE가 Y인 경우 ID를 조회하는 쿼리의 결과가 2건이상이라면,
해당 서브쿼리에서 에러가 발생한다.
ID 값을 한 건의 레코드로 만들 함수 (MAX / GROUP_CONCAT 등.)을 사용해서
단 건의 레코드로 만들어줘야 에러가 해결된다.
▼2
WHERE절에서 발생되는 오류
SELECT
, A.ID
, B.SUBJECT_NAME
FROM COM_STUDENT A, COM_STUDENT_SUBJECT B
WHERE A.ID = B.STUDENT_ID
AND A.ID IN (
(
SELECT X.ID
FROM COM_STUDENT X
WHERE X.GROUP = "MATH" AND X.USE='Y' ---> ERROR 1242
)
,8
)
AND A.USE = 'Y';
다음과 같은 쿼리에서도 오류가 발생한다.
에러가 발생하는 서브쿼리는 IN 절로 감싸져있어서 모를 수 있지만,
해당 서브쿼리와 함께 [8]이라는 값이 IN절에 포함되어 있을 때
해당 쿼리는 동일한 오류를 뱉는다.
[8] 을 제외했을 때, 오류를 벗겨낼 수 있지만 ID 값이 8 인 데이터를 꼭 포함해야하는 경우에는 난감할 수 있다.
위 쿼리는 다음과 같이 고칠 수 있다.
▼ 2.repair
WHERE절에서 발생되는 오류
SELECT
, A.ID
, B.SUBJECT_NAME
FROM COM_STUDENT A, COM_STUDENT_SUBJECT B
WHERE A.ID = B.STUDENT_ID
AND A.ID IN (
SELECT X.ID
FROM COM_STUDENT X
WHERE X.GROUP = "MATH" AND X.USE='Y'
UNION
SELECT 8
FROM DUAL
)
AND A.USE = 'Y';
위와 같이 수정하면 8 을 포함한 값을 조회할 수 있다.
IN 절 내부에 UNION 연산자를 사용할 경우에
레코드 건 수가 많을 경우 데이터 조회 속도 이슈가 발생할 수 있다.
여러 해결방법들이 있으니 개발자의 판단에 따라 효율적으로 사용하시면 될 것 같다.
'개발 > BACK' 카테고리의 다른 글
[RDB MariaDB] 자주 실수하는 쿼리 오류들 모음 (0) | 2023.11.01 |
---|---|
[JAVA] JAVA 8 구현 인터페이스 CompletableFuture를 통해 비동기 처리하기 (0) | 2023.10.31 |
[Tableau] 데이터 분석 툴 연동 방법 [개발자 VER] (0) | 2023.01.09 |
[Mysql] 실행계획 (Explain)에 따른 쿼리튜닝 방법 (0) | 2023.01.06 |
[SpringFramework] 스프링 에러 Error occurred during initialization of boot layer 해결 방법 (0) | 2022.12.27 |