MySQL语法错误消息“操作数应该包含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; 

据我所知,应该从temp_cheques中插入VOUCHER中的每个logging,ID和DENOMINATION字段对应于BOOK表中的条目(temp_cheques来自数据库备份,我尝试以不同的格式重新创build)。 但是,当我运行它,我得到一个错误:

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

我正在SQuirrel中运行,并没有任何其他疑问的问题。 我的查询语法有问题吗?

编辑:

BOOK的结构是:

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

temp_cheques的结构是:

 ID int(11) number varchar(20) 

尝试从SELECT子句中删除括号。 从Microsoft TechNet ,使用SELECT子句的INSERT语句的正确语法如下。

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

你得到的错误,“SELECT将检查超过MAX_JOIN_SIZE行;检查你的WHERE,并使用SET SQL_BIG_SELECTS = 1或SET SQL_MAX_JOIN_SIZE =#如果SELECT是好的。”,实际上是正确的,假设你有很多行书和temp_cheques。 您正试图从两个表中查询所有行并进行交叉引用,从而生成一个m * n大小的查询。 在执行潜在的长时间操作之前,SQL Server正试图警告您这一点。

在运行此语句之前设置SQL_BIG_SELECTS = 1,然后重试。 它应该工作,但请注意,此操作可能需要很长时间。

B是否包含UNITS列?

什么是temp_cheques和Book的表格结构?

编辑:正如我在评论中所说的,所有的列在做+/-和比较时都应该是数字。
以下简单的SELECT工作?

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

我没有一个MySQL实例方便,但我的第一个猜测是WHERE子句:

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

我想,MySQLparsing器可能会解释为:

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

尝试用圆括号包装所有内容,即:

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

查询的最终版本如下所示:

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

BETWEEN语句的parsing需要圆括号,SELECT没有,并且由于两个表的大小(temp_cheques中的215000条logging,BOOK中的8000条logging),我打破了select大小的限制,要求我设置SQL_BIG_SELECTS = 1 。