본문 바로가기

개발/BACK

[MariaDB] SQL 오류 (1242): Subquery returns more than 1 row

728x90

해당 오류는 이름 그대로 서브쿼리에서 두 건 이상의 레코드가 조회될 때, 해당 오류가 발생한다.

대부분의 경우에 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 연산자를 사용할 경우에 

레코드 건 수가 많을 경우 데이터 조회 속도 이슈가 발생할 수 있다. 

 

여러 해결방법들이 있으니 개발자의 판단에 따라 효율적으로 사용하시면 될 것 같다.

728x90