我在Flamerobin(Firebird 2.1)中执行了以下语句。它会在编辑器窗口中报告以下错误
“动态SQL错误SQL错误代码= -104无效的命令计数 列列表和变量列表不匹配“
通常列是匹配的,并且列数没有任何不匹配,但是我相信以单例为基础生成的生成器,以及来自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
)
) )
表的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;
答案 0 :(得分:3)
据我所知,INSERT
不支持Firebird
语法。
您可以使用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
注意: - 使用union feeding方式对第一个select语句中的列进行别名化将使它们在外部查询中以此类名称提供。
答案 1 :(得分:1)
从未使用过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
)
)