代码之家  ›  专栏  ›  技术社区  ›  Elie

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

  •  22
  • Elie  · 技术社区  · 15 年前

    我尝试运行以下语句:

    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;
    

    据我所知,它应该在凭证中插入来自临时支票的每条记录,其中的ID和面额字段与book表中的条目对应(临时支票来自数据库备份,我正尝试以不同的格式重新创建)。但是,当我运行它时,会得到一个错误:

    Error: Operand should contain 1 column(s)
    SQLState:  21000
    ErrorCode: 1241
    

    我在松鼠中运行这个程序,没有任何其他问题。我的查询语法有问题吗?

    编辑:

    书的结构是:

    ID  int(11)
    START_NUMBER    int(11)
    UNITS   int(11)
    DENOMINATION    double(5,2)
    

    临时支票的结构为:

    ID  int(11)
    number  varchar(20)
    
    5 回复  |  直到 15 年前
        1
  •  48
  •   lc.    15 年前

    尝试从select子句中删除括号。从 Microsoft TechNet ,使用select子句的insert语句的正确语法如下。

    INSERT INTO MyTable  (PriKey, Description)
           SELECT ForeignKey, Description
           FROM SomeView
    

    您得到的错误是,“select将检查超过max_join_-size行;检查您的位置并使用set sql_big_selects=1或设置sql_max_join_-size=如果选择正常。”,实际上是正确的,假设您在book和temp_支票中都有许多行。您试图查询两个表中的所有行,并进行交叉引用,从而产生一个m*n大小的查询。在执行可能很长的操作之前,SQL Server正在尝试警告您这一点。

    集合 SQL_BIG_SELECTS =1,然后运行此语句,然后重试。它应该可以工作,但请注意,此操作可能需要很长时间。

        2
  •  3
  •   shahkalpesh    15 年前

    B是否包含单位列?

    临时支票和账簿的表格结构是什么?

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

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

        3
  •  2
  •   RJHunter    15 年前

    我手边没有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);
    
        4
  •  2
  •   Elie    15 年前

    查询的最终版本如下:

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

    分析语句之间需要括号,select没有,由于两个表的大小(临时支票中有215000条记录,书籍中有8000条记录),我打破了select大小的限制,要求我设置sql_big_selects=1。

        5
  •  1
  •   BitfulByte    6 年前

    我在使用Spring存储库时遇到了同样的错误。

    我的存储库包含如下方法:

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

    当对内存中的数据库(h2)运行集成测试时,这是正常的。但是,对于像mysql这样的独立数据库来说,失败的原因是同样的错误。

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

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

    注:两者没有区别 find findAll . 如下所述: Spring Data JPA difference between findBy / findAllBy