Update mit temp Subselect

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:[INDENT]MIS_CU:
CU_No, CU_UP(Stück_Preis)


1111, NULL
1222, NULL
1234, NULL
[/INDENT][INDENT]MIS_PC:
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

[/INDENT]Ich möchte die 1.Tabelle updaten: mit dem niedrigsten Preis aus der Summe der Preispositionen, gruppiert auf No und Staffelmenge.
D.h. in MIS_CU müsste nach dem Update folgendes stehen (die betreffenden DS sind unterstrichen)[INDENT]1111, 10
1222, NULL
1234, 310
[/INDENT]Hier mein SQL mit dem ich auf die Fehlermeldung “Operation muss eine aktualisierbare Abfrage verwenden” treffe:

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
      )

Danke für jeden Tipp!
Gruß

Sry, Hab den Beitrag im falschen Tab erstellt :astonished:
Tipps nehm ich trotzdem gerne entgegen…

Gruß

Da will ich mal nicht so sein heute:

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)

Das anzupassen überlasse ich Dir zur Übung.

Andreas

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…

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;

Funktioniert nicht, da “foo.PC_CU_No” außerhalb des gültigkeitsbereichs liegt…
Außerdem müsste ich auch auf den niedrigsten “PC_QS” (Staffelmenge) gruppieren…
Access geht mir seit Tagen schon auf den Geist.

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

update t1 set [B]preis = summe[/B] from (select id, sum(preis) as summe from t2 group by id) foo where t1.id=foo.id;

Mit einer solchen Anweisung kann Access nicht umgehen.
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 :frowning:

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.

Deswegen muss ich klammern und dadurch rutscht die ID aus dem Gültigkeitsbereich.

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.

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

Den Select habe ich:

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;

Bekomme Ihn aber in keinen korrekten Update String :confused:

Gruß,
Batze

Okay. Beispiel: foo sei Deine Zieltabelle. Deine Abfrage speicherst Du in Tabelle namen. Mein Meispiel:

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)

Nun das Update:

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