【问题标题】:Generator usage in insert statement of FirebirdFirebird插入语句中的生成器使用
【发布时间】:2016-04-08 14:31:42
【问题描述】:

我在 Flamerobin (Firebird 2.1) 中执行了以下语句。编辑器窗口一直报如下错误

" 动态 SQL 错误 SQL 错误代码 = -104 无效的命令计数 列列表和变量列表不匹配"

通常列是匹配的,并且列数没有任何不匹配,但是有生成器,我相信它在单例基础上工作,并且从联合语句生成的数据集可能是错误的根源。

insert into test_table (load_name, X, Y, Z) values (
gen_id(gen_new,1), (select X_I,Y_I,Z_I from 
(
    select e1.X_I,e1.Y_I,e1.Z_I from ELEMENTS e1
    union 
    select e2.X_J,e2.Y_J,e2.Z_J from elements e2
) 
) )

表的 DDL 为:

CREATE TABLE TEST_TABLE
(
  LOAD_NAME Char(20) NOT NULL,
  FACTOR Integer,
  NEW1 Integer,
  "new" Float,
  X Float,
  Y Float,
  Z Float,
  PRIMARY KEY (LOAD_NAME)
);
GRANT DELETE, INSERT, REFERENCES, SELECT, UPDATE
 ON TEST_TABLE TO  SYSDBA WITH GRANT OPTION;

【问题讨论】:

    标签: sql firebird


    【解决方案1】:

    据我所知,Firebird 不支持您的 INSERT 语法。 您可以使用 VALUES 语法提供列值,也可以使用 SELECT 语句检索它们,但我怀疑它们可以在 1 个语句中组合。

    您可能已经知道Firebirds' documentation 不是满载而归,但用途有限。

    下面应该可以工作

    insert into test_table (load_name, X, Y, Z) 
    select gen_id(gen_new, 1), foo.X, foo.Y, foo.Z
    from (
      select e1.X_I AS X, e1.Y_I AS Y, e1.Z_I AS Z from elements e1
      union
      select e2.X_J, e2.Y_J, e2.Z_J from elements e2
      ) foo
    

    注意:- 以联合馈送方式为第一个 select 语句中的列命名将使它们在外部查询中以此类名称可用。

    【讨论】:

    • 我已将文档链接更新到较新的语言参考更新,但请注意,这只是一个更新,您还需要使用 Interbase 6 语言参考(也可从 Firebird 站点获得完整信息) )。
    【解决方案2】:

    从未使用过firebird,但如果它像其他sql框架一样你想要这个

    insert into test_table (load_name, X, Y, Z) 
    (select en_id(gen_new,1), X_I,Y_I,Z_I from 
      (
        select e1.X_I,e1.Y_I,e1.Z_I from ELEMENTS e1
        union 
        select e2.X_J,e2.Y_J,e2.Z_J from elements e2
      ) 
    )
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-25
      • 2013-04-10
      • 2016-08-29
      • 1970-01-01
      相关资源
      最近更新 更多