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