Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Update mit Wert aus selber Tabelle / selbe Spalte

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von regger, 29 Januar 2014.

  1. regger

    regger Benutzer

    Ich möchte ein Update Statement formulieren.
    Die Tabelle ist folgendermaßen aufgebaut.

    +-----------------+-------------+------+-----+---------+----------------+
    | Field | Type | Null | Key | Default | Extra |
    +-----------------+-------------+------+-----+---------+----------------+
    | id | int(11) | NO | PRI | NULL | auto_increment |
    | customized_type | varchar(30) | NO | MUL | | |
    | customized_id | int(11) | NO | | 0 | |
    | custom_field_id | int(11) | NO | MUL | 0 | |
    | value | text | YES | | NULL | |
    +-----------------+-------------+------+-----+---------+----------------+

    Das Field value soll nun für alle Einträge einer custom_field_id auf Grund eines value eines anderen custom_field_id gesetzt werden. Gemeinsamkeit der Einträge ist die customized_id

    Beispiel:

    ID CUSTOMIZED_ID CUSTOM_FIELD_ID VALUE
    1 4 28 655
    1 4 32 -> Dieser Wert soll nun 'ABC' + 655 sein

    Habe schon mit einem CONCAT + Subselect probiert, ohne Erfolg.
     
  2. regger

    regger Benutzer

    Korrektur:

    ID,CUSTOMIZED_ID,CUSTOM_FIELD_ID,VALUE
    1,4,28, 655
    2,4,32, -> Dieser Wert soll nun 'ABC' + 655 sein
     
  3. regger

    regger Benutzer

    z.B.
    Update alle Einträge wo CUSTOM_FIELD_ID = 32 auf 'ABC' + dem value vom Eintrag mit der CUSTOM_FIELD_ID 28, wobei CUSTOMIZED_ID die selbe ist.
     
  4. Hony%

    Hony% Datenbank-Guru

    Ein SQL-Dump mit Schema und einigen Beispieldatensätzen wäre nett.
     
  5. regger

    regger Benutzer

    upload_2014-1-29_11-55-4.png
    Reicht vorerst folgende Info?:
    Alle Einträge, wo custom_field_id = 61 sollen im Feld value auf 'RW' + value aus dem Eintrag mit custom_field_id = 28 gesetzt werden, wo customized_id ident ist.
     

    Anhänge:

  6. ukulele

    ukulele Datenbank-Guru

    Wenn ich das richtig verstehe suchst du ungefähr das hier:
    Code:
    UPDATE    tabelle
    SET        tabelle.VALUE = (    SELECT    'ABC' + t1.value
                                FROM    tabelle t1
                                WHERE    t1.CUSTOM_FILED_ID = 28
                                AND        t1.CUSTOMIZED_ID = tabelle.CUSTOMIZED_ID )
    WHERE    tabelle.CUSTOM_FIELD_ID = 32
    Allerdings gibt es hier mehrere Fehlermöglichkeiten. Der Subselect darf z.B. immer nur einen Wert zurück liefern, also müsste bei dem Code sichergestellt sein das jeder Datensatz nur ein Gegenstück hat. Außerdem bin ich mir nicht sicher ob man TEXT Spalten einfach so verketten kann, eventuell geht das nur bei CHAR. In jedem Fall wären Fehlermeldungen hilfreich.
     
  7. regger

    regger Benutzer

    Danke schon mal!

    Diese Fehlermeldung kommt:
    upload_2014-1-30_8-40-4.png
     
  8. akretschmer

    akretschmer Datenbank-Guru

    Ja, is klar:

    Code:
    mysql> create table foo (i int);
    Query OK, 0 rows affected (0.01 sec)
    
    mysql> update foo set i = (select 5*i from foo);
    ERROR 1093 (HY000): You can't specify target table 'foo' for update in FROM clause
    
    MySQL kann das und vieles mehr nicht. Schreib es um, mach es anders. Oder nehme eine DB, die das und mehr kann:

    Code:
    test=*# create table foo (i int);
    CREATE TABLE
    test=*# update foo set i = (select 5*i from foo);
    UPDATE 0
    
     
  9. regger

    regger Benutzer

    Mist.
    Ich tu mir leider schwer eine andere DB zu nehmen. Es ist eine vorhandene DB unseres Bugtracking und Wiki-Systems (Redmine).
     
  10. ukulele

    ukulele Datenbank-Guru

    Wuste ich gar nicht. Wie müsste das denn in MySQL aussehen, geht das dann überhaupt? *grübel*
     
  11. akretschmer

    akretschmer Datenbank-Guru

    Keine Ahnung. Temp. Tabelle erstellen, die nutzen. Dreckig halt.
     
  12. akretschmer

    akretschmer Datenbank-Guru

    Tja. Im Live-Betrieb die DB wechseln ist sicherlich selten eine Option, das versteh ich. Redmine scheint aber auch mit PG zu laufen: http://www.redmine.org/boards/2/topics/12825
     
  13. regger

    regger Benutzer

    Ich hätte eine Lösung für meinen Fall gefunden:

    Code:
    update custom_values a right outer join custom_values b on a.CUSTOMIZED_ID = b.CUSTOMIZED_ID 
    set a.value = CONCAT('RW', b.value) 
    where a.CUSTOM_FIELD_ID = 61 and b.CUSTOM_FIELD_ID = 28;
    Jedoch bin ich nun draufgekommen dass ich zu jedem Eintrag mit CUSTOM_FIELD_ID = 28 erst einen mit CUSTOM_FIELD_ID = 61 anlegen muss :-(
     
  14. regger

    regger Benutzer

    Geschafft.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden