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 。