13.2.10.9 서브 쿼리 오류
서브 쿼리에만 적용되는 오류가 일부 존재 하며, 이 섹션에서는 그 것에 대하여 설명 합니다.
지원되지 않는 서브 쿼리 구문 :
ERROR 1235 (ER_NOT_SUPPORTED_YET) SQLSTATE = 42000 Message = "This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery'"
이것은 MySQL이 다음과 같은 형식의 문을 지원하지 않는다는 것을 보여줍니다.
SELECT * FROM t1 WHERE s1 IN (SELECT s2 FROM t2 ORDER BY s1 LIMIT 1)
서브 쿼리에서 잘못된 열 수 :
ERROR 1241 (ER_OPERAND_COL) SQLSTATE = 21000 Message = "Operand should contain 1 column (s)"
이 오류는 다음과 같은 경우에 발생합니다.
SELECT (SELECT column1, column2 FROM t2) FROM t1;
목적이 행의 비교 인 경우는 여러 컬럼을 돌려 서브 쿼리를 사용할 수 있습니다. 다른 컨텍스트에서는 서브 쿼리는 스칼라 피연산자이어야합니다. 섹션 13.2.10.5 "행 서브 쿼리" 를 참조하십시오.
서브 쿼리에서 잘못된 행 수 :
ERROR 1242 (ER_SUBSELECT_NO_1_ROW) SQLSTATE = 21000 Message = "Subquery returns more than 1 row"
이 오류는 서브 쿼리가 최대 1 행만 반환해야 없는데도 여러 행을 반환 문에 발생합니다. 다음의 예를 생각해 보겠습니다.
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
SELECT column1 FROM t2
가 1 행만 반환하면 이전 쿼리가 작동합니다. 이 서브 쿼리가 여러 행을 반환하는 경우 오류 1242가 발생합니다. 이 경우이 쿼리를 다음과 같이 바꾼다.SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2);
하위 쿼리가 잘못 사용되는 테이블 :
Error 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000 Message = "You can not specify target table 'x' for update in FROM clause "
이 오류는 테이블을 변경하고, 하위 쿼리 같은 테이블에서 선택하려고하는 다음과 같은 경우에 발생합니다.
UPDATE t1 SET column2 = (SELECT MAX (column1) FROM t1);
서브 쿼리는
SELECT
문뿐만 아니라UPDATE
및DELETE
문 내에서도 적합하기 때문에UPDATE
문에서 지정을 위해 서브 쿼리를 사용할 수 있습니다. 그러나 서브쿼리의 FROM절과 업데이트 target모두를 위해 같은 테이블을 사용할 수 없습니다.
트랜잭션 스토리지 엔진의 경우, 서브 쿼리가 실패하면 전체 문이 실패합니다. 비 트랜잭션 스토리지 엔진의 경우, 오류가 발견되기 전에 수행 된 데이터 변경이 유지됩니다.