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

Daten innerhalb einer Tabelle kopieren - die 2.

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von vater_teresa, 14 März 2013.

  1. vater_teresa

    vater_teresa Neuer Benutzer

    Moin,

    ich glaube, ich habe ein ähnliches Problem wie fridi im Thread hinter mir, konnte mein Problem damit aber nicht lösen.

    Ich muss Änderungen an einer Literaturdatenbank (Citavi) vornehmen.
    In der Datenbank können jedem Titel können mehrere Standorte zugewiesen werden.
    Als ich mit der Datenbank angefangen habe, habe ich alle mein pdf-Dateien unter dem Standort "Lit" mit der entsprechenden Signatur (CallNumber) abgelegt. Auf meinem Rechner sind die Dateien unter z.B. c:\Daten\Lit0189.pdf gespeichert.
    Jetzt stellt sich heraus, dass es eine große Arbeitserleichterung wäre, wenn in der Datenbank der direkte Pfad gespeichert wäre. In citavi kann ich diese Änderungen leider nicht vornehmen, daher bin ich direkt in die Datenbank gegangen.

    Da ich keine Ahnung habe, wie die ID generiert wird, habe ich aus Citavi heraus für jeden Standort "Lit" einen zusätzlichen Standort "temp" erstellt.
    Die Tabelle sieht jetzt vereinfacht so aus:

    Code:
    ID       | Address            |  CallNumber  |  RefID
    ---------+--------------------+-------------------------------------------
    abcd1234 | http:\\irgendwo.de |              | 100001
    efgh5678 | Bibliothek         | 2002/13      | 100002
    jklm9012 | c:\Uni\bsp.doc     |              | 100003
    nopq3456 | Lit                | 0189         | 100004
    rstu7890 | temp               |              | 100004
    
    Ich muss jetzt für jede Spalte mit Address = temp aus der Spalte mit der gleichen RefID den Wert CallNumber auslesen und dann temp durch c:\Daten\Lit[CallNumber].pdf ersetzen.
    Das soll dann so aussehen:

    Code:
    ID       | Address              |  CallNumber  |  RefID
    ---------+----------------------+-------------------------------------------
    abcd1234 | http:\\irgendwo.de   |              | 100001
    efgh5678 | Bibliothek           | 2002/13      | 100002
    jklm9012 | c:\Uni\bsp.doc       |              | 100003
    nopq3456 | Lit                  | 0189         | 100004
    rstu7890 | c:\Daten\Lit0189.pdf |              | 100004
    
    Ich habe jetzt schon alles mit mögliche versucht, aber meine SQL-Kenntnisse scheinen hier aufzuhören.

    Für Euch Experten ist das mit Sicherheit ne Kleinigkeit!

    Schon mal besten Dank für Eure Hilfe!
    Sebastian
     
  2. akretschmer

    akretschmer Datenbank-Guru

    Na, zumindest probieren kann ich es ja mal...

    Code:
    test=# select * from teresa ;
        id    |      address       | callnumber | refid
    ----------+--------------------+------------+--------
     abcd1234 | http:\\irgendwo.de |            | 100001
     efgh5678 | Bibliothek         | Bibliothek | 100002
     jklm9012 | c:\Uni\bsp.doc     |            | 100003
     nopq3456 | Lit                | 0189       | 100004
     rstu7890 | temp               |            | 100004
    (5 rows)
    
    test=*# update teresa set address = 'c:\Daten\Lit' || foo.callnumber || '.pdf' from (select refid, callnumber from teresa) foo where foo.refid=teresa.refid and teresa.address = 'temp';
    UPDATE 1
    test=*# select * from teresa ;
        id    |       address        | callnumber | refid
    ----------+----------------------+------------+--------
     abcd1234 | http:\\irgendwo.de   |            | 100001
     efgh5678 | Bibliothek           | Bibliothek | 100002
     jklm9012 | c:\Uni\bsp.doc       |            | 100003
     nopq3456 | Lit                  | 0189       | 100004
     rstu7890 | c:\Daten\Lit0189.pdf |            | 100004
    (5 rows)
    
    
    Auch hier gleich der Hinweis: das ist jetzt mit PostgreSQL gemacht, das || kennt MySQL nicht. Du mußt schauen, wie man da 2 Strings verkettet.
     
  3. ukulele

    ukulele Datenbank-Guru

    Vermutlich einfach mit + wie bei MS SQL auch. Eventuell muss die callnumber vorher convertiert werden.
    Code:
    address = 'c:\Daten\Lit' + cast(foo.callnumber AS VARCHAR(100)) + '.pdf'
    ...oder ähnlich.
     
  4. vater_teresa

    vater_teresa Neuer Benutzer

    Danke für die Mühe!
    Ich habe die Sache mit der Verkettung jetzt mal außen vor gelassen und
    den Vorschlag auf meine Daten hin geändert.
    Also:
    Code:
    update teresa
    set address = foo.callnumber
    from (select refid, callnumber from teresa) foo
    where foo.refid=teresa.refid and teresa.address = 'temp';
    Der Code macht für mich schon Sinn, ich bekomme jedoch immer einen Syntax-Fehler innerhalb der Unterabfrage zurück (near "from").
     
  5. akretschmer

    akretschmer Datenbank-Guru

    works for me:

    Code:
    test=*# select * from teresa ;
        id    |      address       | callnumber | refid
    ----------+--------------------+------------+--------
     abcd1234 | http:\\irgendwo.de |            | 100001
     efgh5678 | Bibliothek         | Bibliothek | 100002
     jklm9012 | c:\Uni\bsp.doc     |            | 100003
     nopq3456 | Lit                | 0189       | 100004
     rstu7890 | temp               |            | 100004
    (5 rows)
    
    test=*# commit;
    COMMIT
    test=# update teresa
    test-# set address = foo.callnumber
    test-# from (select refid, callnumber from teresa) foo
    test-# where foo.refid=teresa.refid and teresa.address = 'temp';
    UPDATE 1
    test=*# select * from teresa ;
        id    |      address       | callnumber | refid
    ----------+--------------------+------------+--------
     abcd1234 | http:\\irgendwo.de |            | 100001
     efgh5678 | Bibliothek         | Bibliothek | 100002
     jklm9012 | c:\Uni\bsp.doc     |            | 100003
     nopq3456 | Lit                | 0189       | 100004
     rstu7890 | 0189               |            | 100004
    (5 rows)
    
    Andreas
     
  6. vater_teresa

    vater_teresa Neuer Benutzer

    Besten Dank! Jetzt klappt es. Hatte ein Brett vorm Kopf!
     
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