Mensagem de erro de syntax do MySQL “Operando deve conter 1 coluna (s)”

Eu tentei executar a seguinte declaração:

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, pelo que entendi, deve inserir em VOUCHER cada registro de temp_cheques com os campos ID e DENOMINATION correspondentes às inputs na tabela BOOK (temp_cheques vem de um backup de database, que estou tentando recriar em um formato diferente). No entanto, quando o executo, recebo um erro:

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

Estou executando isso no SQuirrel e não tive problemas com outras consultas. Há algo de errado com a syntax da minha consulta?

EDITAR:

A estrutura do LIVRO é:

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

A estrutura dos temp_cheques é:

 ID int(11) number varchar(20) 

Tente remover os parênteses da cláusula SELECT. Do Microsoft TechNet , a syntax correta para uma instrução INSERT usando uma cláusula SELECT é o seguinte.

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

O erro que você está recebendo, “O SELECT examinaria mais de MAX_JOIN_SIZE linhas; verifique seu WHERE e use SET SQL_BIG_SELECTS = 1 ou SET SQL_MAX_JOIN_SIZE = # se o SELECT estiver correto.”, Na verdade está correto, supondo que você tenha muitas linhas em ambos LIVRO e temp_cheques. Você está tentando consultar todas as linhas das duas tabelas e fazer uma referência cruzada, resultando em uma consulta de tamanho m * n. O SQL Server está tentando avisá-lo sobre isso antes de executar uma operação potencialmente longa.

Configure SQL_BIG_SELECTS = 1 antes de executar esta instrução e tente novamente. Deve funcionar, mas note que esta operação pode demorar muito tempo.

B contém a coluna UNITS?

Qual é a estrutura da tabela para temp_cheques e Book?

EDIT: Como eu disse nos comentários, todas as colunas devem ser numéricas ao fazer +/- e quando comparando.
O seguinte simples SELECT funciona?

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

Eu não tenho uma instância do MySQL à mão, mas meu primeiro palpite é a cláusula WHERE:

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

Eu imagino que o analisador MySQL possa estar interpretando isso como:

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

Tente embrulhar tudo entre parênteses, por exemplo:

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

A versão final da consulta é a seguinte:

 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); 

A análise da instrução BETWEEN exigiu parênteses, o SELECT não, e por causa do tamanho das duas tabelas (215000 registros em temp_cheques, 8000 no BOOK) eu estava quebrando um limite no tamanho selecionado, exigindo que eu definisse SQL_BIG_SELECTS = 1 .

Eu corri para o mesmo erro ao usar o Spring Repositories.

Meu repository continha um método como:

 List findAllBySomeId(List ids); 

Isso está funcionando bem ao executar testes de integração em um database na memory (h2). No entanto, contra um database independente como o MySql está falhando com o mesmo erro.

Eu resolvi isso alterando a interface do método para:

 List ids); 

Nota: não há diferença entre find e findAll . Conforme descrito aqui: Diferença do Spring Data JPA entre findBy / findAllBy