Ergebnis 1 bis 10 von 10

Thema: Update mit temp Subselect

  1. #1
    batzenlurch ist offline Neuer Benutzer
    Registriert seit
    06.03.2009
    Beiträge
    6

    Standard 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:
    MIS_CU:
    CU_No, CU_UP(Stück_Preis)
    ________________________
    1111, NULL
    1222, NULL
    1234, NULL
    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
    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)
    1111, 10
    1222, NULL
    1234, 310
    Hier mein SQL mit dem ich auf die Fehlermeldung "Operation muss eine aktualisierbare Abfrage verwenden" treffe:
    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
          )
    Danke für jeden Tipp!
    Gruß
    Geändert von batzenlurch (06.03.2009 um 15:33 Uhr)

  2. #2
    batzenlurch ist offline Neuer Benutzer
    Registriert seit
    06.03.2009
    Beiträge
    6

    Standard

    Sry, Hab den Beitrag im falschen Tab erstellt
    Tipps nehm ich trotzdem gerne entgegen...

    Gruß

  3. #3
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von batzenlurch Beitrag anzeigen
    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, NULL
    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
    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)
    1111, 10
    1222, NULL
    1234, 310
    Hier mein SQL mit dem ich auf die Fehlermeldung "Operation muss eine aktualisierbare Abfrage verwenden" treffe:
    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
          )
    Danke für jeden Tipp!
    Gruß
    Da will ich mal nicht so sein heute:

    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)
    Das anzupassen überlasse ich Dir zur Übung.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  4. #4
    batzenlurch ist offline Neuer Benutzer
    Registriert seit
    06.03.2009
    Beiträge
    6

    Standard

    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.
    Geändert von batzenlurch (06.03.2009 um 17:01 Uhr)

  5. #5
    batzenlurch ist offline Neuer Benutzer
    Registriert seit
    06.03.2009
    Beiträge
    6

    Standard

    *push*

    Evtl. noch jemand eine Idee?

  6. #6
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von batzenlurch Beitrag anzeigen
    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...
    Außerdem müsste ich auch auf den niedrigsten "PC_QS" (Staffelmenge) gruppieren...
    Access geht mir seit Tagen schon auf den Geist.
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  7. #7
    batzenlurch ist offline Neuer Benutzer
    Registriert seit
    06.03.2009
    Beiträge
    6

    Standard

    Code:
    update t1 set preis = summe 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 :-(

    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.

  8. #8
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von batzenlurch Beitrag anzeigen
    Code:
    update t1 set preis = summe 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.
    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  9. #9
    batzenlurch ist offline Neuer Benutzer
    Registriert seit
    06.03.2009
    Beiträge
    6

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    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...
    Den Select habe ich:
    Code:
    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

    Gruß,
    Batze

  10. #10
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Dresden
    Beiträge
    5.465

    Standard

    Zitat Zitat von batzenlurch Beitrag anzeigen
    Den Select habe ich:
    Code:
    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

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

    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)
    Nun das Update:

    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
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

Ähnliche Themen

  1. Update mit subselect
    Von bamdenied im Forum Andere Datenbanken
    Antworten: 7
    Letzter Beitrag: 21.04.2011, 11:23
  2. Frage temp-tables droppen
    Von symbiont im Forum Allgemeines
    Antworten: 8
    Letzter Beitrag: 13.05.2009, 14:19
  3. temp-Tabelle in PL/pgSQL Funktion
    Von merlin-hst im Forum Trigger und Funktionen
    Antworten: 14
    Letzter Beitrag: 26.02.2008, 19:39
  4. Verwendung von TEMP TABLE in einer Funktion
    Von Pittiplatsch im Forum PL/pgSQL
    Antworten: 5
    Letzter Beitrag: 12.12.2007, 15:52
  5. subselect mit like
    Von gnoerz im Forum SQL
    Antworten: 8
    Letzter Beitrag: 01.02.2007, 10:26

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum