ixen: INSERT SELECT

Gemoje,

Ich möchte einen besonderen INSERT SELECT durchführen

INSERT INTO tbl_temp2 (fld_id)
  SELECT tbl_temp1.fld_order_id
  FROM tbl_temp1 WHERE tbl_temp1.fld_order_id > 100;

so stehts auf der dev.mysql.com

aber wie kann ich eine mischung aus
INSERT VALUES('neuer wert') und SELECT bilden, so dass ich einen ganzen Datensatzblock kopieren kann bis auf eine spalte. die soll nämlich einen neuen wert bekommen. es handelt sich dabei aber nicht um den Primary Key.

Beispiel

|-- Primarykey
|           |-- Wer der geändert werden soll
|           |
a | b | c | d |
1 | 5 | 6 | 3 |
2 | 4 | 5 | 3 |
3 | 7 | 2 | 3 |
4 | 5 | 1 | 4 |
5 | 4 | 2 | 4 |
6 | 7 | 3 | 4 |

a ist ja wie bereits erwähnt der primary_key mit auto_increment und beim ausführen der, ich nenns mal, "Duplicate-Aktion", soll der auch schön weiter hochzählen... alles ganz normal

b und c sind die eigentlichen daten (davon gibts aber 10 Spalten, daher bin ich zu faul vorher einen Select * durchzuführen, da es zuviel schreibarbeit wäre (mir ist auch klar das dieses Posting mich zwar noch mehr Zeit kostet, aber wenn mans einmal weis... :D ))

d ist ein feld welches bestimmte Datensätze "zusammenhält". Es Groupt gewisse Daten (...)
Dieser Wert soll bei der Duplicate-Aktion geändert werden.

Beispiel: Ich möchte nun ein Duplicate vornehmen mit folgendem Insert-Select:
Insert (...) SELECT * FROM tbl WHERE d=4
(aber als ergebnis möchte ich dann folgendes haben:)

a | b | c | d |
1 | 5 | 6 | 3 |
2 | 4 | 5 | 3 |
3 | 7 | 2 | 3 |
4 | 5 | 1 | 4 | <-
5 | 4 | 2 | 4 | <-
6 | 7 | 3 | 4 | <-

7 | 5 | 1 | 5 | <-
8 | 4 | 2 | 5 | <-
9 | 7 | 3 | 5 | <-

wie geht das?
ist mein Problem überhaupt verstanden worden? :D

ixen

  1. hi,

    Beispiel: Ich möchte nun ein Duplicate vornehmen mit folgendem Insert-Select:
    Insert (...) SELECT * FROM tbl WHERE d=4
    (aber als ergebnis möchte ich dann folgendes haben:)

    4 | 5 | 1 | 4 | <-
    5 | 4 | 2 | 4 | <-
    6 | 7 | 3 | 4 | <-

    7 | 5 | 1 | 5 | <-
    8 | 4 | 2 | 5 | <-
    9 | 7 | 3 | 5 | <-

    Wenn du den statischen Wert 5 für eine Spalte auslesen willst, dann selektiere 5.

    gruß,
    wahsaga

    --
    /voodoo.css:
    #GeorgeWBush { position:absolute; bottom:-6ft; }
  2. hi,

    a | b | c | d |
    1 | 5 | 6 | 3 |
    2 | 4 | 5 | 3 |
    3 | 7 | 2 | 3 |
    4 | 5 | 1 | 4 | <-
    5 | 4 | 2 | 4 | <-
    6 | 7 | 3 | 4 | <-

    7 | 5 | 1 | 5 | <-
    8 | 4 | 2 | 5 | <-
    9 | 7 | 3 | 5 | <-

    insert into Table (a,b,c,d) values(select a,b,c,5 from Table where d=4)

    so in der Art?

    Gruss,
    Seppel

    1. insert into tbl (b,c,d) values(select b,c from tbl where d=4, '5')

      so in etwa d soll den statischen wert 5 bekommen und der rest soll KOPIERT werden so wie er ist bis auf d!

      ixen

      1. hi,

        insert into tbl (b,c,d) values(select b,c from tbl where d=4, '5')

        so in etwa d soll den statischen wert 5 bekommen und der rest soll KOPIERT werden so wie er ist bis auf d!

        Dann LESE den Rest AUS, so wie er ist.

        gruß,
        wahsaga

        --
        /voodoo.css:
        #GeorgeWBush { position:absolute; bottom:-6ft; }
      2. Hallo,

        so in etwa d soll den statischen wert 5 bekommen und der rest soll KOPIERT werden so wie er ist bis auf d!

        Also genau so wie es seppel schon vorgegeben hat.

        Man kann auch statische Werte anstelle von Spalten in der auszulesenden Spaltenliste bei SELECT-Statements verwenden.

        Grüße
          Klaus

      3. Hallo,

        wie wäre es wenn du b und c mit einem order by-statement sortierst?  Der Rest sollte irgendwie auch hinzubekommen sein.

        Grüße,

        Wolfram

    2. fürs Archiv: So muss die Synthax aussehen!!!!
      insert into Table (a,b,c,d) select a,b,c,5 from Table where d=4
      und nicht so:

      insert into Table (a,b,c,d) values(select a,b,c,5 from Table where d=4)

      ixen

      1. hola,

        schuldig im Sinne der Anklage ;-)

        da kann man ja nur hoffen das dir durch diese Fehlleitung nicht zuviel Zeit verloren gegangen ist!

        Gruss,
        Seppel