Firebird

时间:2016-01-04 21:35:43

标签: sql firebird

我在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;

2 个答案:

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