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

时间:2009-01-19 05:50:15

标签: mysql mysql-error-1241

我尝试运行以下语句:

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)

5 个答案:

答案 0 :(得分:48)

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

答案 1 :(得分:3)

B是否包含UNITS列?

temp_cheques和Book的表结构是什么?

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

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

答案 2 :(得分:2)

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

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

我认为MySQL解析器可能将其解释为:

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

尝试将所有内容包装在括号中,即:

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

答案 3 :(得分:2)

查询的最终版本如下:

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。

答案 4 :(得分:1)

使用Spring Repositories时遇到相同的错误。

我的存储库中包含一种类似的方法:

List<SomeEntity> findAllBySomeId(List<String> ids);

在针对内存数据库(h2)运行集成测试时,此方法工作正常。但是,对于像MySql这样的独立数据库,却因相同的错误而失败。

我已经通过将方法界面更改为:

List<someEntity findBySomeIdIn(List<String> ids);

注意:findfindAll之间没有区别。如此处所述:Spring Data JPA difference between findBy / findAllBy