2013-10-07 30 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

相關問題