than tener solucion should returns more espaƱol error debe columna column code mysql mysql-error-1241

mysql - tener - operand should contain 1 column s solucion



Mensaje de error de sintaxis de MySQL "Operando debe contener 1 columna(s)" (5)

¿B contiene la columna UNITS?

¿Cuál es la estructura de la tabla para temp_cheques y Book?

EDITAR: Como dije en los comentarios, todas las columnas deberían ser numéricas al hacer +/- y al comparar.
¿Funciona el siguiente SELECCION simple?

SELECT b.START_NUMBER+b.UNITS-1 FROM Books B

Traté de ejecutar la siguiente declaración:

INSERT INTO VOUCHER (VOUCHER_NUMBER, BOOK_ID, DENOMINATION) SELECT (a.number, b.ID, b.DENOMINATION) FROM temp_cheques a, BOOK b WHERE a.number BETWEEN b.START_NUMBER AND b.START_NUMBER+b.UNITS-1;

que, según tengo entendido, debe insertar en VOUCHER cada registro de temp_cheques con los campos ID y DENOMINACIÓN correspondientes a las entradas en la tabla BOOK (temp_cheques proviene de una copia de seguridad de la base de datos, que estoy intentando recrear en un formato diferente). Sin embargo, cuando lo ejecuto, aparece un error:

Error: Operand should contain 1 column(s) SQLState: 21000 ErrorCode: 1241

Estoy ejecutando esto en SQuirrel y no he tenido problemas con otras consultas. ¿Hay algún problema con la sintaxis de mi consulta?

EDITAR:

La estructura de BOOK es:

ID int(11) START_NUMBER int(11) UNITS int(11) DENOMINATION double(5,2)

La estructura de temp_cheques es:

ID int(11) number varchar(20)


Intente eliminar el paréntesis de la cláusula SELECT. Desde Microsoft TechNet , la sintaxis correcta para una instrucción INSERT usando una cláusula SELECT es la siguiente.

INSERT INTO MyTable (PriKey, Description) SELECT ForeignKey, Description FROM SomeView

El error que está recibiendo, "SELECT examinaría más de MAX_JOIN_SIZE filas, revise su WHERE y use SET SQL_BIG_SELECTS = 1 o SET SQL_MAX_JOIN_SIZE = # si SELECT está bien.", Es realmente correcto, suponiendo que tiene muchas filas en ambos BOOK y temp_cheques. Está intentando consultar todas las filas de ambas tablas y hacer una referencia cruzada, lo que da como resultado una consulta de tamaño m * n. SQL Server intenta advertirle sobre esto, antes de realizar una operación potencialmente larga.

Establezca SQL_BIG_SELECTS = 1 antes de ejecutar esta instrucción y vuelva a intentarlo. Debería funcionar, pero tenga en cuenta que esta operación puede llevar mucho tiempo.


La versión final de la consulta es la siguiente:

Set SQL_BIG_SELECTS = 1; INSERT INTO VOUCHER (VOUCHER_NUMBER, BOOK_ID, DENOMINATION) SELECT a.number, b.ID, b.DENOMINATION FROM temp_cheques a, BOOK b WHERE a.number BETWEEN b.START_NUMBER AND (b.START_NUMBER+b.UNITS-1);

El análisis sintáctico de la instrucción BETWEEN requería paréntesis, el SELECT no, y debido al tamaño de las dos tablas (215000 registros en temp_cheques, 8000 en BOOK) estaba rompiendo un límite en el tamaño de selección, requiriendo que establezca SQL_BIG_SELECTS = 1 .


Me encontré con el mismo error cuando uso Spring Repositories.

Mi repositorio contenía un método como:

List<SomeEntity> findAllBySomeId(List<String> ids);

Esto funciona bien cuando se ejecutan pruebas de integración en una base de datos en memoria (h2). Sin embargo, contra una base de datos independiente como MySql estaba fallando con el mismo error.

Lo he solucionado cambiando la interfaz del método a:

List<someEntity findBySomeIdIn(List<String> ids);

Nota: no hay diferencia entre find y findAll . Como se describe aquí: Diferencia de Spring Data JPA entre findBy / findAllBy


No tengo una instancia de MySQL a mano, pero mi primera suposición es la cláusula WHERE:

WHERE a.number BETWEEN b.START_NUMBER AND b.START_NUMBER+b.UNITS-1;

Me imagino que el analizador de MySQL puede interpretar eso como:

WHERE number (BETWEEN start_number AND start_number) + units - 1

Intenta envolver todo entre paréntesis, es decir:

WHERE a.number BETWEEN b.START_NUMBER AND (b.START_NUMBER + b.UNITS - 1);