Daten innerhalb einer Tabelle kopieren - die 2.

vater_teresa

Neuer Benutzer
Beiträge
3
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
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.846
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

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.
 

ukulele

Datenbank-Guru
Beiträge
4.702
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.
 

vater_teresa

Neuer Benutzer
Beiträge
3
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").
 

akretschmer

Datenbank-Guru
Beiträge
9.846
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").

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
 
Werbung:
Oben