2013-10-07 8 views
6

Sagen wir, ich habe eine Tabelle mit den folgenden Spalten:Legen Sie mehrere Zeilen in eine Tabelle mit nur einem Wert ändert

Feld 1 | Feld 2 | Feld3 | field4

Ich möchte mehrere Zeilen in diese Tabelle einfügen, aber die Werte von field1, field2 und field3 sind für jede Zeile identisch. Nur der Wert von field4 wird sich ändern.

Natürlich könnte ich jede Zeile separat einfügen, aber die resultierende Abfrage wäre ein bisschen hässlich, und ich frage mich, ob es eine effizientere/elegantere Möglichkeit ist, es zu tun.

Ich dachte an so etwas wie dies zum Beispiel:

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

Und das Ergebnis wäre:

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

In der Praxis der Spalte 'field4' ist ein String-Typ, und die verschiedenen Werte sind bekannt, wenn ich die Abfrage schreibe. Es gibt keine Notwendigkeit, sie von einem Tisch oder irgendetwas zu bekommen (obwohl, wenn es möglich ist, bin ich an einer Lösung interessiert, die es tun kann) Ist das möglich oder muss ich jeden Einsatz separat schreiben?

EDIT: Ich habe die Frage geändert, um klarer über den Datentyp der wechselnden Spalte (allgemeine Textdaten) und woher kommen die Daten. Entschuldigung für diejenigen, die bereits ohne diese Informationen geantwortet haben.

Danke.

+0

"Ist das möglich oder muss ich jeden Einsatz separat schreiben?" > Letzteres :-) –

+0

Woher kommt der Wert für field4? ist es die laufende Nummer oder etwas anderes? – Noel

+0

Wenn Sie zu Ramblin's Man Frage hinzufügen, wenn Sie alle Werte für Feld4 kennen, können Sie sie als 'Tabellenwertfunktion' bereitstellen, ändern Sie Ihre' Einfügung', um '' 'anstelle von' Werten' zu verwenden. und verbinden Sie diese Werte von der Funktion ... – DrCopyPaste

Antwort

3

Sie mit einer case Aussage eine Variante Nicholas Krasnows Antwort verwenden könnte die Zeichenfolge-Werte zu setzen:

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.

Das Hinzufügen von mehr Zeilen/Werten würde nur eine Änderung an level Limit und zusätzliche when Klauseln erforderlich machen. (like this). Sie könnten auch eine else mit einer Warnung haben, falls Sie eine Diskrepanz in den Zahlen bekommen. Es gibt keine besondere Bedeutung, zu welcher Zeichenfolge Wert mit dem Wert level übrigens geht.

3

Hier ist eine Möglichkeit, es zu tun - aber wahrscheinlich sauberer und einfacher auf mehrere Insert-Anweisungen zu schreiben:

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

Danke. Ich akzeptiere die Antwort noch nicht, da es vielleicht mehr Antworten gibt, aber Ihre ist eine interessante Lösung. In meinem Beispiel ist es in der Tat sauberer, mehrere Insert-Anweisungen zu verwenden, aber meine echte Abfrage ist länger und komplexer, und dies kann eine gute Lösung sein. – Kaidjin

+0

@Kaidjin - keine Sorge, froh, dass es geholfen hat! – sgeddes

5

Der einfachste Weg, dieser Vorteil nehmen würde, zu bewerkstelligen die connect by Klausel von select Anweisung, um so viele synthetische Reihen zu erzeugen, wie Sie benötigen.

Angenommen field1 zu field3 sind von varchar2 Datentyp und die field4 ist der Zahlendatentypen, wie die Probe von Daten und insert Anweisung Sie implizieren zur Verfügung gestellt haben, dann könnten Sie schreiben die folgende insert Anweisung

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 */ 

Ergebnis:

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

bearbeiten:

Wenn Sie buchstäblich wollen value one sehen, value two und so weiter als Werte der fiedl4 Spalte, können Sie die oben insert Anweisung wie folgt ändern:

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 

Ergebnis:

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 

Wenn Wenn Sie das mit absolut zufällig generiertem Zeichenfolgenliteral füllen möchten, können Sie dbms_random Paket und string() Funktion speziell verwenden:

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

Ergebnis:

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

Danke für Ihre Antwort, aber die Daten sind nicht numerisch und es gibt keine logische Sequenz für diese Daten. Ich habe meine Frage aktualisiert, um klarer zu sein, aber danke vielmals, ich kannte diese Klausel nicht und sie wird mir definitiv eines Tages nützlich sein. – Kaidjin

+0

@Kaidjin Was bedeutet "Wert eins" und so weiter? Woher kommen diese Daten? Möchten Sie die Spalte mit einem zufälligen varchar2-Wert füllen oder möchten Sie buchstäblich den Wert eins, den Wert zwei usw. als Wert für diese Spalte sehen? –

+0

Diese Daten sind bekannt, wenn ich die Abfrage schreibe. Ich muss nur mehrere Zeilen einfügen, die einander sehr ähnlich sind. Es ist nicht notwendig, die Werte von einer anderen Tabelle oder ähnlichem zu bekommen. Ich möchte nur einige Insert-Anweisungen zu einem faktorisieren, wenn nur eine Spalte von einem Insert zu einem anderen wechselt. Sie sind also nicht zufällig, ich habe eine Liste in den Spezifikationen. – Kaidjin

Verwandte Themen