Hay algunos retornos de error nuevos que se aplican sólo a subconsultas. Esta sección los agrupa ya que revisarlos ayuda a recordar algunos puntos importantes.
Número incorrecto de columnas de la subconsulta:
ERROR 1241 (ER_OPERAND_COL) SQLSTATE = 21000 Message = "Operand should contain 1 column(s)"
Este error ocurre en casos como este:
SELECT (SELECT column1, column2 FROM t2) FROM t1;
Se permite usar una subconsulta que retorne múltiples columnas, si el propósito es la comparación. Consulte Sección 13.2.8.5, “Subconsultas de registro”. Sin embargo, en otros contextos, la subconsulta debe ser un operando escalar.
Número incorrecto de registros de la subconsulta:
ERROR 1242 (ER_SUBSELECT_NO_1_ROW) SQLSTATE = 21000 Message = "Subquery returns more than 1 row"
Este error ocurre de comandos en que la subconsulta retorna más de un registro. Considere el siguiente ejemplo:
SELECT * FROM t1 WHERE column1 = (SELECT column1 FROM t2);
Si SELECT column1 FROM t2
retorna sólo
un registro la consulta anterior funcionará. Si la
subconsulta retorna más de un registro, ocurre el error
1242 . En ese caso, la consulta debe reescribirse como:
SELECT * FROM t1 WHERE column1 = ANY (SELECT column1 FROM t2);
Tabla usada incorrectamente en la subconsulta:
Error 1093 (ER_UPDATE_TABLE_USED) SQLSTATE = HY000 Message = "You can't specify target table 'x' for update in FROM clause"
Este error ocurre en casos como el siguiente:
UPDATE t1 SET column2 = (SELECT MAX(column1) FROM t1);
Puede usar una subconsulta para asignaciones dentro del
comando UPDATE
, ya que las subconsultas
son legales en los comandos UPDATE
y
DELETE
así como en los
SELECT
. Sin embargo, no puede usar la
misma tabla (en este caso la tabla t1
)
para la cláusula FROM
de la
subconsulta y el objetivo a actualizar.
Para motores transaccionales, el fallo de una subconsulta provoca que falle el comando entero. Para motores no transaccionales, las modificaciones de datos hechas antes de encontrar el error se preservan.
Ésta es una traducción del manual de referencia de MySQL, que puede encontrarse en dev.mysql.com. El manual de referencia original de MySQL está escrito en inglés, y esta traducción no necesariamente está tan actualizada como la versión original. Para cualquier sugerencia sobre la traducción y para señalar errores de cualquier tipo, no dude en dirigirse a mysql-es@vespito.com.