MySQL 작업 중 "ER_SUBQUERY_NO_1_ROW" 또는 "ERROR 1242: Subquery returns more than 1 row" 오류에 직면했다면, 이는 서브쿼리가 단일 행 대신 여러 행을 반환했기 때문입니다. 이 오류 메시지는 서브쿼리의 결과가 예상과 다르게 여러 개의 행을 반환하여, 단일 행을 요구하는 연산(예: `=`, `<>`, `>`, `<` 등)에 문제가 발생했음을 알려주는 에러입니다.
문제 상황
아래와 같은 쿼리문을 작성했는데 이 오류가 발생했답니다.
SELECT * FROM table1 AS A WHERE A.column1 = (SELECT B.column1 FROM table2 AS B WHERE '조건');
이 쿼리는 table1의 column1과 table2의 column1을 비교할 때, table2에서 지정된 조건에 일치하는 column1의 값을 단 하나만 출력하기 위해 쿼리문을 작성한건데 아래와 같은 오류가 나더라구요.
code: 'ER_SUBQUERY_NO_1_ROW',
errno: 1242,
sqlMessage: 'Subquery returns more than 1 row',
sqlState: '21000',
where 뒤쪽에 있는 검색 쿼리문에서 결과가 하나만 나와야 하는데 두개 이상의 결과가 나왔기 때문에 오류가 발생한거였답니다.
하나만 나오게 했지만 여러개의 출력이 나올 수도 있기 때문에 `=` 이라는 기호가 잘못된거 같아요.
해결 방법
이 문제를 해결하기 위해 = 연산자 대신 IN 연산자를 사용할 수 있습니다.
SELECT * FROM table1 AS A WHERE A.column1 IN (SELECT B.column1 FROM table2 AS B WHERE '조건');
IN 연산자는 서브쿼리의 결과가 여러 행일 때도 사용할 수 있으며, table1의 column1 값이 table2의 column1에 해당하는 어느 값과도 일치하는지 확인합니다.
추가 팁
- 서브쿼리가 여러 행을 반환할 것으로 예상되면, 처음부터 IN 연산자를 사용하는 것이 좋습니다.
- 만약 서브쿼리에서 단 하나의 특정 값을 얻기를 원한다면, LIMIT 1을 사용하여 서브쿼리의 결과를 하나로 제한할 수 있습니다. 그러나 이 방법은 반환되는 특정 행이 의도한 결과인지를 보장하지 않으므로 주의가 필요합니다.
- 서브쿼리가 의도치 않게 여러 행을 반환하는 경우, 쿼리의 논리를 다시 검토하고 데이터 모델을 확인하여 문제의 근본 원인을 해결하는 것이 중요합니다.
결론
이 정보를 통해 "ER_SUBQUERY_NO_1_ROW" 오류를 효과적으로 해결하고, MySQL 쿼리 작성 시 발생할 수 있는 흔한 문제를 방지할 수 있길 바랍니다.
함께보면 좋은글
'Language > SQL' 카테고리의 다른 글
[MYSQL] 숫자, 문자열, 날짜시간 변환하기 CAST함수 (0) | 2023.03.14 |
---|---|
[SQLITE3] datetime 으로 년, 월, 일 시작 날짜 구하기 (0) | 2023.02.08 |
[MYSQL] 같은/다른 테이블에서 원하는 행들 복사 붙여넣기 (2) | 2022.09.14 |
[MYSQL] 검색한 결과를 넣기 select 하여 insert (0) | 2022.08.09 |
[MYSQL] GROUP_CONCAT에서 order by 정렬하기, 구분자, 한글깨짐 (0) | 2022.08.04 |