Sry, Hab den Beitrag im falschen Tab erstellt
Tipps nehm ich trotzdem gerne entgegen...
Gruß
Hallo Forum-Gemeinde,
z.Z. benutze ich (leider) Access03. Ich möchte ein Update auf eine Tabelle mit einem Subselect ausführen. Leider bekomme ich den SQL nicht korrekt zusammen. Evtl. könnt Ihr mir helfen...
Also ich habe 2 Tabellen:MIS_CU:
CU_No, CU_UP(Stück_Preis)
________________________
1111, NULL
1222, NULL
1234, NULLMIS_PC:Ich möchte die 1.Tabelle updaten: mit dem niedrigsten Preis aus der Summe der Preispositionen, gruppiert auf No und Staffelmenge.
PC_CU_No, PC_QS(Staffelmenge), PC_Act(Preispos)
_______________________________________________
1111, 50, 5
1111, 50, 2
1111, 10, 6
1111, 10, 4
1234, 90, 100
1234, 90, 180
1234, 10, 120
1234, 10, 190
D.h. in MIS_CU müsste nach dem Update folgendes stehen (die betreffenden DS sind unterstrichen)1111, 10Hier mein SQL mit dem ich auf die Fehlermeldung "Operation muss eine aktualisierbare Abfrage verwenden" treffe:
1222, NULL
1234, 310
Danke für jeden Tipp!Code:UPDATE MIS_CU SET MIS_CU.CU_UP = (SELECT MIN(Preis.stck_preis) AS stck_preis FROM (SELECT MIS_PC.PC_CU_No, SUM(MIS_PC.PC_Act) AS stck_preis FROM MIS_PC GROUP BY MIS_PC.PC_CU_No, MIS_PC.PC_QS ) AS Preis WHERE MIS_CU.CU_NO = Preis.PC_CU_No GROUP BY Preis.PC_CU_No ) WHERE MIS_CU.CU_NO IN (SELECT MIS_PC.PC_CU_No FROM MIS_PC GROUP BY MIS_PC.PC_CU_No )
Gruß
Geändert von batzenlurch (06.03.2009 um 15:33 Uhr)
Sry, Hab den Beitrag im falschen Tab erstellt
Tipps nehm ich trotzdem gerne entgegen...
Gruß
Da will ich mal nicht so sein heute:
Das anzupassen überlasse ich Dir zur Übung.Code:test=# select * from t1; id | preis ----+------- 1 | 2 | 3 | (3 Zeilen) Zeit: 0,143 ms test=*# select * from t2; id | preis ----+------- 1 | 10 1 | 15 1 | 20 2 | 50 2 | 100 (5 Zeilen) Zeit: 0,260 ms test=*# update t1 set preis = summe from (select id, sum(preis) as summe from t2 group by id) foo where t1.id=foo.id; UPDATE 2 Zeit: 0,410 ms test=*# select * from t1; id | preis ----+------- 3 | 1 | 45 2 | 150 (3 Zeilen)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Werde ich gleich direkt mal testen.
Vielen Dank und ein schönes Wochenende!
Gruß,
batze
edit:
Ich will nicht dreist erscheinen, aber ich verzweifel an dem string...
Funktioniert nicht, da "foo.PC_CU_No" außerhalb des gültigkeitsbereichs liegt...update MIS_CU set MIS_CU.CU_UP = (select summe from (select PC_CU_NO, sum(IS_PPC_Act) as summe from MIS_PC group by PC_CU_NO)) where MIS_CU.CU_No=foo.PC_CU_No;
Außerdem müsste ich auch auf den niedrigsten "PC_QS" (Staffelmenge) gruppieren...
Access geht mir seit Tagen schon auf den Geist.
Geändert von batzenlurch (06.03.2009 um 17:01 Uhr)
*push*
Evtl. noch jemand eine Idee?
Nun ja, schau Dir an,was ich getan habe, und vergleich mit dem, was Du versuchst. Dann sollte sich der Fehler mit dem foo erklären. Und eine Aggregat-Funktion (sum) gegen eine andere (min) auszutauschen zählt für mich als Übungsaufgabe zum lernen. Und zwar an Dich gerichtet. Und wenn Dir Access auf den Geist geht: warum nutzt Du es dann?
PS.: mittels edit einen Beitrag zu verändern birgt die Gefahr, daß andere den Beitrag bereits gelesen haben und ihn somit nicht mehr als NEU sehen und somit übersehen.
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Mit einer solchen Anweisung kann Access nicht umgehen.Code:update t1 set preis = summe from (select id, sum(preis) as summe from t2 group by id) foo where t1.id=foo.id;
Deswegen muss ich klammern und dadurch rutscht die ID aus dem Gültigkeitsbereich.
Außerdem muss ich ja nicht nur die ID(CU_No) sondern auch auf die Staffelmenge (CU_QS) gruppieren. Wie im ersten Beitrag beschrieben ist es eigentlich total simpel.. aber es will mir einfach nicht gelingen :-(
PS. Ich bin kein SQL-Anfänger und hoffe, dass ich mich jetzt hier nicht mit irgendwelchen SQLs brüsten muss... Arbeite nur aushilfsweise mit Access und bin froh wenn ich mich zurück in meine Standardumgebung verziehen kann.
Das finde ich jetzt, ähm, sehr schade, animiert mich aber nicht im geringsten, nach einer passenden Access-Lösung zu suchen.
Vielleicht veruscht Du einfach mal zu verstehen, was ich da tat: meine Tabelle foo ist nur ein temp. Zwischenresultat, welches gruppiert nach id die Summe je id enthält. Du kannst die sum() - Funktion auch gegen min() oder sowas austauschen.
Außerdem versuchst Du, einen einzelnen Wert mit dem Resultat eines Selects zu setzen, was u.U. deutlich mehr als ein einzeiliges Resultat sein kann. Außerdem taucht das 'foo' bei Dir nur noch in der where-Bedingung auf, nicht aber im from. Von daher wundert es mich nicht im geringsten, daß es nicht geht.Deswegen muss ich klammern und dadurch rutscht die ID aus dem Gültigkeitsbereich.
PS. Ich bin kein SQL-Anfänger und hoffe, dass ich mich jetzt hier nicht mit irgendwelchen SQLs brüsten muss... Arbeite nur aushilfsweise mit Access und bin froh wenn ich mich zurück in meine Standardumgebung verziehen kann.
Oder Du versuchst erst einmal ein Select hinzubekommen, was Dir, wie bei mir foo, je id den Wert berechnet. Wenn Du erst einmal das hast, ist der Rest trivial...
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Den Select habe ich:
Bekomme Ihn aber in keinen korrekten Update StringCode:SELECT MIS_CU.*, (SELECT Min(Preise.stck_preis) AS stck_preis FROM ( SELECT MIS_PC.PC_CU_No, Sum(MIS_PC.PC_Act) AS stck_preis FROM MIS_PC GROUP BY MIS_PC.PC_CU_No, MIS_PC.PC_QS ) AS Preise WHERE MIS_CU.CU_NO = Preise.PC_CU_No GROUP BY Preise.PC_CU_No ) FROM MIS_CU;
Gruß,
Batze
Okay. Beispiel: foo sei Deine Zieltabelle. Deine Abfrage speicherst Du in Tabelle namen. Mein Meispiel:
Nun das Update:Code:test=# select * from foo; id | name ----+------ 1 | 2 | 3 | (3 rows) test=*# select * from namen; id | name ----+------------- 1 | batzenlurch 2 | akretschmer 3 | ads (3 rows)
Code:test=*# update foo set name = namen.name from namen where foo.id=namen.id; UPDATE 3 test=*# select * from foo; id | name ----+------------- 1 | batzenlurch 2 | akretschmer 3 | ads (3 rows)
Andreas
--
https://www.xing.com/profile/Andreas_Kretschmer7ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen