我尝试运行以下语句:

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)

最佳答案

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

10-04 22:05
查看更多