【问题标题】:Using select and values with insert into将 select 和 values 与 insert into 一起使用
【发布时间】:2012-01-04 04:32:58
【问题描述】:

我正在编写一个存储过程。我知道如何将值从select 传递到insert

但是,INSERT INTO 是否可以同时使用valuesSelect

Insert into table_1 (f1, f2, f3, f4, f5, f6, f7, f8, f9,
      FL1, FL2, FL3)

      Select :p_f1, :v_f2, :p_f3, :p_f4,
        abs(:v_f5 * :p_f5),
        abs(:v_f6 * :p_f6),
        :v_f7, :v_f8, :v_9 from RDB$DATABASE
      UNION
      Select f_lookup_id from lookup_table where (f_res >= :v_res) And (f2_lookup_id = :p_id1)
      UNION
      Select f_lookup_id from lookup_table where (f_res >= :v_res) And (f2_lookup_id = :p_id2)
      UNION
      Select f_lookup_id from lookup_table where (f_res >= :v_res) And (f2_lookup_id = :p_id3);

【问题讨论】:

  • 在这里很难说出你在问什么。你能举例说明你在做什么吗?你对你想要做什么的最佳猜测?
  • 我可以在一个语句中使用 VALUES 和 Select with Insert into 吗?

标签: sql sql-insert firebird


【解决方案1】:

我猜你想使用SELECT 语句的结果集作为INSERT 语句的输入?是的,这是可能的,请参阅FB's language reference。可能导致您出现问题的部分是您在这种情况下不使用 VALUES 关键字,该语句看起来像

INSERT INTO table (fields) SELECT ...

或者,如果您想在一个语句中同时包含“常量值”(如在 INSERT INTO ... VALUES(...) 语句中)和“动态值”(使用 SELECT 语句作为源),那么您可以将它们合并,即

INSERT INTO table (fields)
     SELECT fields FROM tab_src ...
   UNION
     SELECT constants FROM RDB$DATABASE

其中constants 是适当类型的值列表。


更新

好吧,我猜你想要的实际上是这样的

Insert into table_1 (f1, f2, f3, f4, f5, f6, f7, f8, f9, FL1, FL2, FL3)
VALUES(:p_f1, :v_f2, :p_f3, :p_f4,
        abs(:v_f5 * :p_f5),
        abs(:v_f6 * :p_f6),
        :v_f7, :v_f8, :v_9,
        (Select f_lookup_id from lookup_table where (f_res >= :v_res) And (f2_lookup_id = :p_id1)),
        (Select f_lookup_id from lookup_table where (f_res >= :v_res) And (f2_lookup_id = :p_id2)),
        (Select f_lookup_id from lookup_table where (f_res >= :v_res) And (f2_lookup_id = :p_id3))
)

【讨论】:

  • 我收到错误:SQL 错误代码 = -104。命令无效。列列表和变量列表的计数不匹配。我在主线程中用上面的通用字段名称编写了我的 SQL - 请告知。谢谢
  • 错误信息count of column list and variable list do not match 很清楚,不是吗?您的INSERT 语句列出了 12 列,因此每个“源行”也必须有 12 列,并且这些列的类型必须与目标列的类型匹配。但是你联合的一些SELECT 语句只有一列!对于源表没有的字段,您可以使用 NULL 或其他(常量)默认值代替字段名称。
  • 是的,消息很清楚,但我在第一次选择中尝试了零,但 RDB$DATABASE 也无法得出结论,所以感谢您的启发 - 我现在使用了这样的零:f_lookup_id,0,0对于第一个语句和 0、f_lookup_id、0 等等 - 但使用 UNION 不会使零或 null 覆盖实际值?
  • 也使用联合将返回多行但我只需要一行我尝试了第一次但仍然得到多行
  • 查看更新的答案,select语句必须是单选(只返回一行)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-16
  • 1970-01-01
  • 1970-01-01
  • 2012-01-23
  • 2021-12-10
  • 2019-02-22
相关资源
最近更新 更多