24

我尝试运行以下语句:

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

5 回答 5

58

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

于 2009-01-19T06:34:55.360 回答
3

B 是否包含 UNITS 列?

temp_cheques 和 Book 的表结构是什么?

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

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

于 2009-01-19T05:58:48.490 回答
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);
于 2009-01-19T06:11:29.057 回答
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 .

于 2009-01-19T06:33:19.717 回答
1

我在使用 Spring Repositories 时遇到了同样的错误。

我的存储库包含一个方法,如:

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

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

我通过将方法接口更改为:

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

find注意:和之间没有区别findAll。如此处所述: Spring Data JPA 之间 findBy / findAllBy 的区别

于 2018-07-04T07:19:52.193 回答