为了账号安全,请及时绑定邮箱和手机立即绑定

MySQL语法错误消息“操作数应包含1列”

MySQL语法错误消息“操作数应包含1列”

收到一只叮咚 2019-09-06 16:07:49
我尝试运行以下语句:INSERT INTO VOUCHER (VOUCHER_NUMBER, BOOK_ID, DENOMINATION)SELECT (a.number, b.ID, b.DENOMINATION) FROM temp_cheques a, BOOK bWHERE 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:  21000ErrorCode: 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)
查看完整描述

3 回答

?
回首忆惘然

TA贡献1847条经验 获得超11个赞

尝试从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,然后重试。它应该工作,但请注意,此操作可能需要很长时间。


查看完整回答
反对 回复 2019-09-06
?
烙印99

TA贡献1829条经验 获得超13个赞

B是否包含UNITS列?

temp_cheques和Book的表结构是什么?

在进行+/-和比较时,所有列都应该是数字。

以下简单的SELECT是否有效?

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


查看完整回答
反对 回复 2019-09-06
?
四季花海

TA贡献1811条经验 获得超5个赞

查询的最终版本如下:


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语句的解析需要括号,SELECT没有,并且由于两个表的大小(temp_cheques中的215000条记录,BOOK中的8000条),我打破了选择大小的限制,要求我设置SQL_BIG_SELECTS = 1 。


查看完整回答
反对 回复 2019-09-06
  • 3 回答
  • 0 关注
  • 1094 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信