| 

.NET C# Java Javascript Exception

3
Hallo zusammen,

zunächst die "Randbedingungen" auf das Nötigste reduziert:
Tabelle 1 enthält 2 Spalten: ea mit einer eindeutigen Nummer (in Tabelle 1 unique), eb ist leer.
Tabelle 2 enthält auch 2 Spalten; za enthält n mal (also nicht unique) die Nummer aus Tabelle 1 Spalte ea, zb enthält verschiedene Werte.

Ich möchte nun dazu kommen, dass ich in eb den Maximalwert aus zb (inner join tab1.ea über tab2.za) mittels einer Abfrage schreiben kann. Mein bisheriger Lösungsversuch über VB.NET ist nicht so wirklich prikelnd und performant: ich lese Tabelle 1 komplett ein, über For Each Row marschiere ich über alle Zeilen und mache das Update mit zig Tausend Update-Befehlen so:

UPDATE tabl SET eb=(SELECT max(zb) FROM tab2 WHERE za=" & ea & ") WHERE ea=" & ea & ";

Natürlich habe ich vorher das versucht:

UPDATE tab1 INNER JOIN tab2 ON tab1.ea=tab2.za SET tab1.eb=max(tab2.zb)

Ergibt natürlich den schrecklichen Fehler "Invalid use of group function".

Lässt sich das vielleicht doch irgendwie hinbekommen?

Vielen Dank für Anregungen!
News:
18.05.2011
muffi 1,4k 1 9
2 Antworten
2
So würde ich es in MSSQL machen und sollte auch in MySQL so, oder so ähnlich gehen:

update T1 set T1.eb=Th.ebMax
from tab1 T1
join (
select max(zb) [ebMax], za
from tab2
group by za
) Th on Th.za = T1.ea


Die MySQL-Docs schreiben um Thema "Update with Join" folgende Beispiele:

UPDATE FROM tblTransaction AS t
LEFT JOIN tblEmployee as e
ON e.emp_id = t.emp_id
SET t.emp_block = e.emp_block

UPDATE items,month SET items.price=month.price
WHERE items.id=month.id;


Alternative kannst du auch Temptabellen nutzen die von MySQL unterstütz werden:

CREATE TEMPORARY TABLE TempTable ( za int, ebMax int) TYPE=HEAP;

INSERT INTO TempTable
select za,max(zb) [ebMax]
from tab2
group by za

UPDATE
FROM tab1 AS t1
LEFT JOIN TempTable as Th ON th.za = t1.ea
SET t.eb = th.ebMax

DROP TABLE TempTable;
18.05.2011
Floyd 14,6k 3 9
Floyd 14,6k 3 9
1
Hallo Floyd,
Variante 1 habe ich ums Verrecken nicht zum Laufen gebracht; dafür war Variante 2 mit der temptable absolut genial. Das läuft!
Vielen Dank.
muffi 19.05.2011
2
Nur so eine Idee:

Vielleicht hilft auch ein DB-Trigger, der beim Einfügen eines neuen Wertes in die Tabelle 2 den Wert mit dem aktuell eingetragegen Wert in Tabelle 1 vergleicht und ggf. den höheren Wert übernimmt. Die Kosten für die Abfrage sind dann auf die Einfügeoperation verschoben.
18.05.2011
oopexpert 455 1 8

Stelle deine Mysql-Frage jetzt!