Aktualisierungsabfrage ausführen
Aktualisierungsabfrage ausführen
am 05.08.2006 22:54:29 von Steffen Grellmann
Hallo Newsgroup,
ich möchte unter MySQL 3.23.54 eine Aktualisierungsabfrage ausführen.
In Access-SQL würde das wie folgt funktionieren, aber unter MySQL
bekomme ich es partout nicht hin:
UPDATE tbl_adr_adressen INNER JOIN tbl_temp ON tbl_adr_adressen.Firma
= tbl_temp.ID SET tbl_adr_adressen.FirmenName = [tbl_temp].[Nachname];
Was muss ich hier ändern, damit es auch unter MySQL funktioniert?
Für einen Tipp wäre ich dankbar.
Freundliche Grüße,
Steffen Grellmann
Re: Aktualisierungsabfrage ausführen
am 05.08.2006 23:19:59 von Nico Haase
Hallöchen,
*Steffen Grellmann* schrub:
> ich möchte unter MySQL 3.23.54 eine Aktualisierungsabfrage ausführen.
> In Access-SQL würde das wie folgt funktionieren, aber unter MySQL
> bekomme ich es partout nicht hin:
>
> UPDATE tbl_adr_adressen INNER JOIN tbl_temp ON tbl_adr_adressen.Firma
> = tbl_temp.ID SET tbl_adr_adressen.FirmenName = [tbl_temp].[Nachname];
UPDATE und JOIN vertragen sich erst ab 4.0.4 in einem gemeinsamen
Query.
mfg
Nico
--
www.buchtips.net - Rezensionen online
Re: Aktualisierungsabfrage ausführen
am 05.08.2006 23:45:19 von Steffen Grellmann
Hallo Nico,
vielen Dank für Deine Antwort.
On Tue, 05 Aug 2006 21:19:59 GMT, Nico Haase
wrote:
>> UPDATE tbl_adr_adressen INNER JOIN tbl_temp ON tbl_adr_adressen.Firma
>> = tbl_temp.ID SET tbl_adr_adressen.FirmenName = [tbl_temp].[Nachname];
>
>UPDATE und JOIN vertragen sich erst ab 4.0.4 in einem gemeinsamen
>Query.
Gibt es einen Workaround?
Freundliche Grüße,
Steffen Grellmann
Re: Aktualisierungsabfrage ausführen
am 06.08.2006 11:34:03 von Dominik Echterbruch
Steffen Grellmann wrote:
>
>>>UPDATE tbl_adr_adressen INNER JOIN tbl_temp ON tbl_adr_adressen.Firma
>>>= tbl_temp.ID SET tbl_adr_adressen.FirmenName = [tbl_temp].[Nachname];
>>
>>UPDATE und JOIN vertragen sich erst ab 4.0.4 in einem gemeinsamen
>>Query.
>
> Gibt es einen Workaround?
Vermutlich keinen, der dir gefallen würde... Spricht etwas gegen ein
Update von MySQL? Immerhin scheinst du ja mit einer sehr alten Version
zu arbeiten (im Moment ist 5.x aktuell).
Ansonsten fällt mir auf Anhieb nur ein, ein Skript zu schreiben, das
erst den SELECT macht und dan für alle gefundenen Zeilen das UPDATE
Statement zusammenbaut.
Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal
Re: Aktualisierungsabfrage ausführen
am 06.08.2006 11:44:23 von Steffen Grellmann
Hallo Dominik,
vielen Dank für Deine Antwort.
On Sun, 06 Aug 2006 11:34:03 +0200, Dominik Echterbruch
wrote:
>Steffen Grellmann wrote:
>>
>>>>UPDATE tbl_adr_adressen INNER JOIN tbl_temp ON tbl_adr_adressen.Firma
>>>>= tbl_temp.ID SET tbl_adr_adressen.FirmenName = [tbl_temp].[Nachname];
>>>
>>>UPDATE und JOIN vertragen sich erst ab 4.0.4 in einem gemeinsamen
>>>Query.
>>
>> Gibt es einen Workaround?
>
>Vermutlich keinen, der dir gefallen würde... Spricht etwas gegen ein
>Update von MySQL? Immerhin scheinst du ja mit einer sehr alten Version
>zu arbeiten (im Moment ist 5.x aktuell).
Das Update will ich demnächst angehen.
>Ansonsten fällt mir auf Anhieb nur ein, ein Skript zu schreiben, das
>erst den SELECT macht und dan für alle gefundenen Zeilen das UPDATE
>Statement zusammenbaut.
Das habe ich mir auch schon überlegt. Kannst Du mir vielleicht in
groben Zügen erklären, wie so ein Skript aussehen könnte? Muß ich
damit Variablen arbeiten?
Freundliche Grüße,
Steffen Grellmann
Re: Aktualisierungsabfrage ausführen
am 06.08.2006 11:57:13 von Dominik Echterbruch
Steffen Grellmann wrote:
>
>>Steffen Grellmann wrote:
>>
>>>>>UPDATE tbl_adr_adressen INNER JOIN tbl_temp ON tbl_adr_adressen.Firma
>>>>>= tbl_temp.ID SET tbl_adr_adressen.FirmenName = [tbl_temp].[Nachname];
>>>>
>>>>UPDATE und JOIN vertragen sich erst ab 4.0.4 in einem gemeinsamen
>>>>Query.
>>>
>>>Gibt es einen Workaround?
>
>>Ansonsten fällt mir auf Anhieb nur ein, ein Skript zu schreiben, das
>>erst den SELECT macht und dan für alle gefundenen Zeilen das UPDATE
>>Statement zusammenbaut.
>
> Das habe ich mir auch schon überlegt. Kannst Du mir vielleicht in
> groben Zügen erklären, wie so ein Skript aussehen könnte? Muß ich
> damit Variablen arbeiten?
Kleiner Tipp dazu: Schau mal in dieser Newsgroup, was da am 04.08.2006
um 20:13 von einem gewissen j_wenke für ein Thread gestartet wurde. Und
der passende Zaunpfahl dazu: "UPDATE-Probl. mit 2 Tabellen". Vorlesen
werde ich es dir bestimmt nicht ;)
Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal
Re: Aktualisierungsabfrage ausführen
am 06.08.2006 12:12:48 von Thomas Rachel
Steffen Grellmann wrote:
>>Ansonsten fällt mir auf Anhieb nur ein, ein Skript zu schreiben, das
>>erst den SELECT macht und dan für alle gefundenen Zeilen das UPDATE
>>Statement zusammenbaut.
>
> Das habe ich mir auch schon überlegt. Kannst Du mir vielleicht in
> groben Zügen erklären, wie so ein Skript aussehen könnte? Muà ich
> damit Variablen arbeiten?
Ja, aber nicht innerhalb von MySQL, wie es Dir vielleicht vorschweben
würde.
Du machst im Prinzip eine normale SELECT-Abfrage, und Deine Applikation
macht dann Zeile für Zeile den Update, der sich aus den zurückgegebenen
Werten ergibt.
Evtl. könnte performancemäÃig das applikationsseitige Kumulieren der
Werte etwas bringen und beim Update dann "... WHERE id IN (...)". Sofern
es diese IN-Schreibweise in 3.23 überhaupt schon gibt...
Thomas
--
Blödsinnige Liedtexte, Teil 3:
"Erzähle mir, norwegisches Mädchen, wie zu Eingabetaste Deine Welt..."
"Gryy zr, abejrtvny tvey, ubj gb ragre lbhe jbeyq..."
Re: Aktualisierungsabfrage ausführen
am 06.08.2006 12:56:04 von Steffen Grellmann
Hallo Dominik,
vielen Dank für den Tipp.
On Sun, 06 Aug 2006 11:57:13 +0200, Dominik Echterbruch
wrote:
>Kleiner Tipp dazu: Schau mal in dieser Newsgroup, was da am 04.08.2006
>um 20:13 von einem gewissen j_wenke für ein Thread gestartet wurde. Und
>der passende Zaunpfahl dazu: "UPDATE-Probl. mit 2 Tabellen". Vorlesen
>werde ich es dir bestimmt nicht ;)
update "über mehrere Tabellen" funktioniert bei 3.23 so:
create table tmp (...);
insert into tmp (felder) select ...; #alles zusammengepackt
update tmp set c=id where ss = b;
alter table tmp drop COLUMN id;
rename table tmp to K;
Mit folgendem Skript gelingt es mir wenigstens, das Abfrageergebnis in
die tbl_temp1 zu schreiben:
INSERT INTO tbl_temp1 (Firma, Nachname)
SELECT
`tbl_adr_adressen`.`Firma`,
`tbl_adr_adressen1`.`Nachname`
FROM
`tbl_adr_adressen`
INNER JOIN `tbl_adr_adressen` `tbl_adr_adressen1` ON
(`tbl_adr_adressen`.`Firma` = `tbl_adr_adressen1`.`ID`)
Was ich nicht hinbekomme, ist das UPDATE der Ursprungstabelle. Zum
Hintergrund: In der tbl_adr_adressen ist in der Spalte "Firma" der
Firmenname nur als ID (als Verweis auf einen Nachnamen in der selben
Tabelle) gespeichert und ich will diese ID nun in der Ursprungstabelle
in den Firmennamen auflösen.
Freundliche Grüße,
Steffen Grellmann
Re: Aktualisierungsabfrage ausf
am 06.08.2006 13:26:22 von Steffen Grellmann
Hallo Thomas,
vielen Dank für Deine Antwort.
On Sun, 06 Aug 2006 12:12:48 +0200, Thomas Rachel
wrote:
>Ja, aber nicht innerhalb von MySQL, wie es Dir vielleicht vorschweben
>würde.
>
>Du machst im Prinzip eine normale SELECT-Abfrage, und Deine Applikation
>macht dann Zeile für Zeile den Update, der sich aus den zurückgegebenen
>Werten ergibt.
>
>Evtl. könnte performancemäßig das applikationsseitige Kumulieren der
>Werte etwas bringen und beim Update dann "... WHERE id IN (...)". Sofern
>es diese IN-Schreibweise in 3.23 überhaupt schon gibt...
Es handelt sich um ein Access-Frontend. Das Update dort durchzuführen
wäre an sich technisch problemlos realisierbar, allerdings wäre es mir
aus organisatorischen Gründen lieber es in Form eines SQL-Skriptes
zusammen mit anderen Aktualisierungen direkt auf der MySQL-DB
durchzuführen.
Freundliche Grüße,
Steffen Grellmann
Re: Aktualisierungsabfrage ausführen
am 06.08.2006 15:30:47 von Dominik Echterbruch
Steffen Grellmann wrote:
>
>>Kleiner Tipp dazu: Schau mal in dieser Newsgroup, was da am 04.08.2006
>>um 20:13 von einem gewissen j_wenke für ein Thread gestartet wurde. Und
>>der passende Zaunpfahl dazu: "UPDATE-Probl. mit 2 Tabellen". Vorlesen
>>werde ich es dir bestimmt nicht ;)
>
> Mit folgendem Skript gelingt es mir wenigstens, das Abfrageergebnis in
> die tbl_temp1 zu schreiben:
>
> INSERT INTO tbl_temp1 (Firma, Nachname)
> SELECT
> `tbl_adr_adressen`.`Firma`,
> `tbl_adr_adressen1`.`Nachname`
> FROM
> `tbl_adr_adressen`
> INNER JOIN `tbl_adr_adressen` `tbl_adr_adressen1` ON
> (`tbl_adr_adressen`.`Firma` = `tbl_adr_adressen1`.`ID`)
Willst du in der endgültigen Tabelle wirklich nur Firma und Nachname
stehen haben? Wenn nicht, solltest du hier alle später gewünschten
Spalten selektieren.
> Was ich nicht hinbekomme, ist das UPDATE der Ursprungstabelle. Zum
> Hintergrund: In der tbl_adr_adressen ist in der Spalte "Firma" der
> Firmenname nur als ID (als Verweis auf einen Nachnamen in der selben
> Tabelle) gespeichert und ich will diese ID nun in der Ursprungstabelle
> in den Firmennamen auflösen.
Das Prinzip, das hinter dem Ansatz steckt ist ja:
1.) Alle gewünschten Daten in der gewünschten Form in eine neue Tabelle
schieben
2.) die Tabelle, die geändert werden soll, löschen
3.) Die neue Tabelle auf den alten Namen umbenennen
Wenn du also die Daten in der temporären Tabelle stehen hast, fehlen dir
noch die Schritte 2 und 3.
Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal
Re: Aktualisierungsabfrage ausführen
am 06.08.2006 16:06:46 von j_wenke
Hi Steffen
> ...
nach obigem posting müssen *alle* benötigten Spalten
in *einer* Arbeits-Tab. zusammengeführt sein
(Ursprungstabelle, tbl_temp1 ?).
ich habs hier oben nochmal ausführlicher gepostet:
UPDATE-Probl. mit 2 Tabellen
Gruß, Jörg
Re: Aktualisierungsabfrage ausführen
am 06.08.2006 20:43:07 von Steffen Grellmann
Hallo Dominik,
hallo Jörg,
vielen Dank für Eure Tipps. Jetzt klappt das wie gewünscht.
Da die betreffende Tabelle sehr viele Spalten umfasst, stört es mich
etwas dass ich bei INSERT und SELECT die Auflistung der Spalten
angeben muss. Könnte man das noch eleganter lösen?
insert into tmp (id,ss,b,c)
select id,ss,b,c
Freundliche Grüße,
Steffen Grellmann
Re: Aktualisierungsabfrage ausführen
am 07.08.2006 19:24:14 von Dominik Echterbruch
Steffen Grellmann wrote:
>
> Da die betreffende Tabelle sehr viele Spalten umfasst, stört es mich
> etwas dass ich bei INSERT und SELECT die Auflistung der Spalten
> angeben muss. Könnte man das noch eleganter lösen?
Wie schon ganz am Anfang bemerkt, wird dir die Lösung vermutlich nicht
gefallen :)
Das Einfachste wäre sicherlich (wenn auch jetzt erst mal mit etwas mehr
Aufwand verbunden), MySQL auf eine aktuelle Version zu bringen. Du
erhältst damit ja noch viel mehr Möglichkeiten. Und ich habe den
Eindruck, daß du im Moment nicht so viel Zeitdruck hast, daß du nicht
nochmal einen Tag dran hängen könntest. Länger sollte das Update
wirklich nicht dauern.
Aber ganz wichtig: _Vorher_ intensiv die Updateanleitungen im Handbuch
lesen. Da stehen sehr viele wirklich essentielle Dinge drin, die dir das
Updaten mächtig vermiesen können!
Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal
Re: Aktualisierungsabfrage ausführen
am 07.08.2006 20:11:53 von Steffen Grellmann
Hallo Dominik,
vielen Dank für Deine Antwort und die Tipps.
On Mon, 07 Aug 2006 19:24:14 +0200, Dominik Echterbruch
wrote:
>> Da die betreffende Tabelle sehr viele Spalten umfasst, stört es mich
>> etwas dass ich bei INSERT und SELECT die Auflistung der Spalten
>> angeben muss. Könnte man das noch eleganter lösen?
>
>Wie schon ganz am Anfang bemerkt, wird dir die Lösung vermutlich nicht
>gefallen :)
Ich habe in meinem Skript jetzt doch alle Spalten einzeln aufgeführt.
War eigentlich kein Problem. Ich hatte nur die Sorge, dass sich ein
Schreibfehler oder ein Fehler in der Reihenfolge einschleicht, habe
aber aber alles gründlich getestet und geprüft.
>Das Einfachste wäre sicherlich (wenn auch jetzt erst mal mit etwas mehr
>Aufwand verbunden), MySQL auf eine aktuelle Version zu bringen. Du
>erhältst damit ja noch viel mehr Möglichkeiten. Und ich habe den
>Eindruck, daß du im Moment nicht so viel Zeitdruck hast, daß du nicht
>nochmal einen Tag dran hängen könntest. Länger sollte das Update
>wirklich nicht dauern.
Das Update will ich demnächst auch gerne angehen.
>Aber ganz wichtig: _Vorher_ intensiv die Updateanleitungen im Handbuch
>lesen. Da stehen sehr viele wirklich essentielle Dinge drin, die dir das
>Updaten mächtig vermiesen können!
Herzlichen Dank für den Tipp, schaue ich mir gründlich an.
Freundliche Grüße,
Steffen Grellmann