2013-10-07 26 views
6

假设我有一个表格,其中包含以下列:将多行插入表中只有一个值更改

field 1 |字段2 | field3 | field4

我想在此表中插入多行,但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 

在实践中,“栏位4”列是一个字符串类型,不同的价值观在我写查询时是已知的。没有必要从桌子或其他任何东西上拿到它们(尽管如果可能的话,我对可以做到的解决方案感兴趣) 这是可行的还是我将不得不分别写入每个插页?

编辑:我已经改变了问题,以更清楚地更改列(一般文本数据)的数据类型和数据来自哪里。很抱歉,没有这些信息的人已经回答了。

谢谢。

+0

“这是可行的还是我将不得不分别写入每个插页?” >后者:-) –

+0

field4的值来自哪里?它是序列号还是别的? – Noel

+0

添加到Ramblin的人的问题,如果你知道field4的所有值,你可以提供它们作为一个“表值函数”,改变你的'insert'使用'select'而不是'values'?并加入这些函数的值... – DrCopyPaste

回答

3

你可以使用尼古拉斯克拉斯诺夫的答案的变化与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 Fiddle

添加更多的行/值只需要更改level限制和额外的when子句进行匹配。 (like this)。如果你的数字不匹配,你也可以有一个else带有警告。顺便说一句,对于哪个字符串值具有哪个值,没有特别的意义。

3

这里有一个办法做到这一点 - 但也许更清洁,更容易编写多重插入语句:

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); 
+0

谢谢。我还没有接受答案,因为可能有更多的答案,但你的答案是一个有趣的解决方案。在我的例子中,使用多个插入语句确实更清晰,但我真正的查询更长,更复杂,这可能是一个好的解决方案。 – Kaidjin

+0

@Kaidjin - 不用担心,很高兴帮助! – sgeddes

5

做到这一点会被占便宜的最简单方法select语句的connect by子句可根据需要生成尽可能多的合成行。

假设field1field3varchar2数据类型和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列的值,你可以改变上述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 
+0

感谢您的回答,但数据不是数字,并且此数据没有逻辑顺序。我已经更新了我的问题,以便更清楚,但非常感谢,我不知道这一条款,并且总有一天它对我有用。 – Kaidjin

+0

@Kaidjin“价值一”等是什么意思?那些数据来自哪里?你想用一个随机的varchar2值填充列,或者你真的想看到“值1”,“值2”等等作为该列的值吗? –

+0

当我编写查询时,这些数据是已知的。我只需插入多条彼此非常相似的线。没有必要从另一个表或类似的东西获取值。我只是想将几个插入语句放入一个,只有一列从一个插入到另一个插入。所以他们不是随机的,我在规范中有一个列表。 – Kaidjin

相关问题