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中的每个记录,其ID和DENOMINATION字段对应于BOOK表中的条目(temp_cheques来自数据库备份,我试图以不同的格式重新创建)。但是,当我运行它时,我收到一个错误:


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)


收到一只叮咚
浏览 1095回答 3
3回答

回首忆惘然

尝试从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没问题。”,实际上是正确的,假设你有两行BOOK和temp_cheques。您正在尝试查询两个表中的所有行并进行交叉引用,从而产生m * n大小的查询。在执行可能很长的操作之前,SQL Server正试图警告您。SQL_BIG_SELECTS在运行此语句之前设置= 1,然后重试。它应该工作,但请注意,此操作可能需要很长时间。

烙印99

B是否包含UNITS列?temp_cheques和Book的表结构是什么?在进行+/-和比较时,所有列都应该是数字。以下简单的SELECT是否有效?SELECT b.START_NUMBER+b.UNITS-1 FROM Books B

四季花海

查询的最终版本如下:Set SQL_BIG_SELECTS = 1;INSERT INTO VOUCHER (VOUCHER_NUMBER, BOOK_ID, DENOMINATION)SELECT a.number, b.ID, b.DENOMINATIONFROM temp_cheques a, BOOK bWHERE a.number BETWEEN b.START_NUMBER AND (b.START_NUMBER+b.UNITS-1);BETWEEN语句的解析需要括号,SELECT没有,并且由于两个表的大小(temp_cheques中的215000条记录,BOOK中的8000条),我打破了选择大小的限制,要求我设置SQL_BIG_SELECTS = 1 。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

MySQL