8

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

字段 1 | 字段 2 | 字段3 | 字段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' 列是字符串类型,不同的值在我编写查询时是已知的。无需从表或任何东西中获取它们(尽管如果可能的话,我对可以做到的解决方案感兴趣)这是可能的还是我必须分别编写每个插入?

编辑:我已将问题更改为更清楚地了解更改列的数据类型(一般文本数据)以及数据来自何处。对于那些已经在没有这些信息的情况下回答的人,我们深表歉意。

谢谢。

4

3 回答 3

6

实现这一点的最简单方法是利用语句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 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  

结果:

 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 

结果:

FIELD1 FIELD2 FIELD3 FIELD4
------ ------ ------ --------
foo    bar    baz    dbtcenz
foo    bar    baz    njykkdy
foo    bar    baz    bcvgabo
foo    bar    baz    ghxcavn
foo    bar    baz    solhgmm
于 2013-10-07T14:49:25.180 回答
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);
于 2013-10-07T14:48:21.470 回答
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           

SQL 小提琴

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

于 2013-10-07T15:08:48.443 回答