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

Kai*_*jin 7 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'))
Run Code Online (Sandbox Code Playgroud)

结果将是:

field1 | field2 | field3 | field4
foo    | bar    | baz    | value one
foo    | bar    | baz    | value two
foo    | bar    | baz    | value four
foo    | bar    | baz    | value five
Run Code Online (Sandbox Code Playgroud)

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

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

谢谢.

Nic*_*nov 6

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

假设field1field3varchar2数据类型和field4是Number数据类型,数据的样本,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 */ 
Run Code Online (Sandbox Code Playgroud)

结果:

FIELD1      FIELD2      FIELD3      FIELD4
----------- ----------- ----------- ----------
foo         bar         baz                  1
foo         bar         baz                  2
foo         bar         baz                  3
foo         bar         baz                  4
foo         bar         baz                  5
Run Code Online (Sandbox Code Playgroud)

编辑:

如果您希望逐字地查看value one,value two等等作为fiedl4列的值,您可以更改上述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  
Run Code Online (Sandbox Code Playgroud)

结果:

 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
Run Code Online (Sandbox Code Playgroud)

如果要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 
Run Code Online (Sandbox Code Playgroud)

结果:

FIELD1 FIELD2 FIELD3 FIELD4
------ ------ ------ --------
foo    bar    baz    dbtcenz
foo    bar    baz    njykkdy
foo    bar    baz    bcvgabo
foo    bar    baz    ghxcavn
foo    bar    baz    solhgmm
Run Code Online (Sandbox Code Playgroud)


sge*_*des 5

这是一种方法——但可能更干净、更容易编写多个插入语句:

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);
Run Code Online (Sandbox Code Playgroud)


Ale*_*ole 4

您可以使用 Nicholas Krasnov 答案的变体和语句case来设置字符串值:

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           
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

添加更多行/值只需要更改限制level和额外的when子句即可匹配。(像这样)。else如果您发现数字不匹配,您还可能会收到警告。顺便说一句,哪个字符串值与哪个值对应没有特殊意义level