生成器在 Firebird 插入语句中的使用

Generator usage in insert statement of Firebird

我在 Flamerobin (Firebird 2.1) 中执行了以下语句。它一直在编辑器上报告以下错误 window

" Dynamic SQL Error SQL error code = -104 Invalid command count of column list and variable list do not match "

通常列是匹配的,并且列计数没有任何不匹配,但是我认为生成器是在单例基础上工作的,并且 union 语句生成的数据集可能是错误的来源。

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

table 的 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;

从未使用过 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
  ) 
)

据我所知,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 语句中的列进行别名将使它们在外部查询中以此类名称可用。