Tengo una tabla mysql simple:
CREATE TABLE IF NOT EXISTS `pers` (
`persID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(35) NOT NULL,
`gehalt` int(11) NOT NULL,
`chefID` int(11) DEFAULT NULL,
PRIMARY KEY (`persID`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=4 ;
INSERT INTO `pers` (`persID`, `name`, `gehalt`, `chefID`) VALUES
(1, 'blb', 1000, 3),
(2, 'as', 1000, 3),
(3, 'chef', 1040, NULL);
Intenté ejecutar la siguiente actualización, pero solo aparece el error 1093:
UPDATE pers P
SET P.gehalt = P.gehalt * 1.05
WHERE (P.chefID IS NOT NULL
OR gehalt <
(SELECT (
SELECT MAX(gehalt * 1.05)
FROM pers MA
WHERE MA.chefID = MA.chefID)
AS _pers
))
Busqué el error y lo encontré en la siguiente página de mysql http://dev.mysql.com/doc/refman/5.1/en/subquery-restrictions.html , pero no me ayuda.
¿Qué debo hacer para corregir la consulta SQL?
sql
mysql
mysql-error-1093
CSchulz
fuente
fuente
Respuestas:
El problema es que MySQL, por el motivo que sea, no le permite escribir consultas como esta:
Es decir, si está haciendo un
UPDATE
/INSERT
/DELETE
en una tabla, no puede hacer referencia a esa tabla en una consulta interna ( sin embargo, puede hacer referencia a un campo de esa tabla externa ...)La solución es reemplazar la instancia de
myTable
en la subconsulta con(SELECT * FROM myTable)
, como esteAparentemente, esto hace que los campos necesarios se copien implícitamente en una tabla temporal, por lo que está permitido.
Encontré esta solución aquí . Una nota de ese artículo:
fuente
T
y(SELECT * FROM T)
son completamente equivalentes. Son la misma relación. Por lo tanto, esta es una restricción arbitraria e inútil. Más específicamente, es una solución para obligar a MySQL a hacer algo que claramente puede hacer, pero por alguna razón no puede analizar en su forma más simple.DELETE FROM t WHERE tableID NOT IN (SELECT viewID FROM t_view);
También recomiendo correrOPTIMIZE TABLE t;
después para reducir el tamaño de la tabla.Puedes hacer esto en tres pasos:
...
o
fuente
CREATE TABLE
declaraciones; espero que el autor lo sepa. Sin embargo, ¿es esta la única solución? ¿O se puede reescribir la consulta con subconsultas o combinaciones? ¿Y por qué (no) hacer eso?UPDATE Pers P
leerUPDATE pers P
?CREATE TABLE AS SELECT
da un desempeño horrible?En Mysql, no puede actualizar una tabla subconsultando la misma tabla.
Puede separar la consulta en dos partes, o hacer
fuente
SELECT ... SET
? Nunca he escuchado sobre esto.AS B
en la segunda referencia aTABLE_A
. la respuesta en el ejemplo más votado podría simplificarse usando enAS T
lugar de la potencialmente ineficienteFROM (SELECT * FROM myTable) AS something
, que afortunadamente el optimizador de consultas generalmente elimina pero no siempre puede hacerlo.Hacer una tabla temporal (tempP) desde una subconsulta
He introducido un nombre separado (alias) y le doy un nuevo nombre a la columna 'persID' para la tabla temporal
fuente
SELECT ( SELECT MAX(gehalt * 1.05)..
- el primeroSELECT
no selecciona ninguna columna.Es bastante simple. Por ejemplo, en lugar de escribir:
Deberías escribir
o similar.
fuente
El Enfoque publicado por BlueRaja es lento. Lo modifiqué porque estaba usando para eliminar duplicados de la tabla. En caso de que ayude a alguien con tablas grandes Consulta original
Esto lleva más tiempo:
Solución más rápida
fuente
Solo como referencia, también puede usar Variables Mysql para guardar resultados temporales, por ejemplo:
https://dev.mysql.com/doc/refman/5.7/en/user-variables.html
fuente
Si está intentando leer el campo A de la tabla A y guardarlo en el campo B de la misma tabla, cuando fieldc = fieldd puede considerar esto.
El código anterior copia el valor del campo A al campo B cuando condición-campo cumple con su condición. esto también funciona en ADO (por ejemplo, acceso)
fuente: lo intenté
fuente
MariaDB ha levantado esto a partir de 10.3.x (tanto para
DELETE
comoUPDATE
):DBFiddle MariaDB 10.2 - Error
DBFiddle MariaDB 10.3 - Éxito
fuente
Otras soluciones incluyen el uso de SELECT DISTINCT o LIMIT en la subconsulta, aunque no tienen un efecto tan explícito en la materialización. esto funcionó para mí
como se menciona en MySql Doc
fuente
MySQL no permite seleccionar de una tabla y actualizar en la misma tabla al mismo tiempo. Pero siempre hay una solución :)
Esto no funciona >>>>
Pero esto funciona >>>>
fuente