将多行插入表中,只更改一个值

时间:2013-10-07 14:40:02

标签: sql oracle

假设我有一个包含以下列的表:

字段1 |场2 | field3 |字段4

我想在此表中插入多行,但field1,field2和field3的值对于每一行都是相同的。只有field4的值会改变。

显然我可以单独插入每一行,但结果查询会有点难看,我想知道是否有一种更有效/更优雅的方法。

我想到了类似的东西:

insert into my_table (field1, field2, field3, field4) values (foo, bar, baz, ('value one','value two','value three','value four'))

结果将是:

field1 | field2 | field3 | field4
foo    | bar    | baz    | value one
foo    | bar    | baz    | value two
foo    | bar    | baz    | value four
foo    | bar    | baz    | value five

实际上,'field4'列是一种字符串类型,当我编写查询时,不同的值是已知的。没有必要从桌子或任何东西中获取它们(尽管如果可能的话,我对能够做到这一点的解决方案感兴趣) 这是可能的还是我必须单独写每个插件?

编辑:我已经将问题更改为更改列的数据类型(一般文本数据)以及数据来自何处。对于那些已经回答没有这些信息的人抱歉。

感谢。

3 个答案:

答案 0 :(得分:5)

实现此目的的最简单方法是利用connect by语句的select子句生成所需数量的合成行。

假设field1field3属于varchar2数据类型且field4属于数字数据类型,数据样本和insert声明你提供了暗示,然后你可以写下面的insert陈述

Insert into your_table_name(field1, field2, field3, field4)
   select 'foo'
        , 'bar'   /* static string literals */
        , 'baz'
        , level  /* starts at 1 and will be increased by 1 with each iteration */
    from dual
 connect by level <= 5  /* regulator of number of rows */ 

结果:

FIELD1      FIELD2      FIELD3      FIELD4
----------- ----------- ----------- ----------
foo         bar         baz                  1
foo         bar         baz                  2
foo         bar         baz                  3
foo         bar         baz                  4
foo         bar         baz                  5

修改

如果您希望将value onevalue two等字面视为fiedl4列的值,则可以按如下方式更改上述{​​{1}}语句:

insert

结果:

Insert into your_table_name(field1, field2, field3, field4)
   select 'foo'
        , 'bar'          
        , 'baz'
        , concat('value ', to_char(to_date(level, 'J'), 'jsp'))          
    from dual
 connect by level <= 5  

如果您想使用绝对随机生成的字符串文字填充 FIELD1 FIELD2 FIELD3 FIELD4 ------ ------ ------ ------------- foo bar baz value one foo bar baz value two foo bar baz value three foo bar baz value four foo bar baz value five ,您可以专门使用field4包和dbms_random函数:

string()

结果:

Insert into your_table_name(field1, field2, field3, field4)
  select 'foo'
       , 'bar'          
       , 'baz'
       , dbms_random.string('l', 7)       
   from dual
connect by level <= 5 

答案 1 :(得分:4)

这是一种方法 - 但可能更简洁,更容易编写多个插入语句:

insert into my_table
select 1,1,1,field
from (select 1 field from dual 
      union select 2 from dual 
      union select 3 from dual);

答案 2 :(得分:3)

您可以使用case语句对Nicholas Krasnov的答案进行修改,以设置字符串值:

insert into my_table(field1, field2, field3, field4)
select 'foo', 'bar', 'baz',
  case level
    when 1 then 'value one'
    when 2 then 'value two'
    when 3 then 'value three'
    when 4 then 'value four'
  end
from dual
connect by level <= 4;

select * from my_table;

FIELD1 FIELD2 FIELD3 FIELD4             
------ ------ ------ --------------------
foo    bar    baz    value one            
foo    bar    baz    value two            
foo    bar    baz    value three          
foo    bar    baz    value four           

SQL Fiddle

添加更多行/值只需更改level限制和额外when子句即可。 (like this)。如果您的号码不匹配,您也可以else发出警告。顺便提一下,哪个字符串值跟level值一致没有特别的意义。