• schon wieder-.-


    Folgendes Problem:
    Ich soll eine Prozedur (erstmal nur in SQL später in PLSQL) schreiben, die die Spalte BESTELL_TOTAL mit dem Wert des Produktes (Bestellmenge*Einzelpreis) Bestellmenge befindet sich in Bestell_Position, Einzelpreis im Artikel.
    Vlt sei noch zu sagen, dass die Tabelle Bestelung die Spalte BESTELL_TOTAL schon behinhaltet, jeder Wert doch mit NULL belegt ist.


    Soweit hab ichs bisher.

    Code
    update bestellung_copy 
      set bestell_total=
      (select ac.einzelpreis*bpc.bestellmenge
      from artikel_copy ac, best_position_copy bpc
      where ac.artikelnr = bpc.artikelnr) 
    where bestellung_copy.bestellnr = best_position_copy.bestellnr;


    aka. ich hol mir erstmal das Produkt, update das dann in die Tabelle Bestellung in die Spalte BESTELL_TOTAL. Funktioniert aber nicht.
    Fehler lautet wie folgt:


  • In der WHERE bedingung hat er keinen Zugriff auf die Tabelle best_position_copy und somit auch nicht auf die Spalte best_position_copy.bestellnr .


    Allerdings bekommst du in deinem Sub Select Probleme.

    Code
    select ac.einzelpreis*bpc.bestellmenge
      from artikel_copy ac, best_position_copy bpc
      where ac.artikelnr = bpc.artikelnr


    Folgende Tabelleninhalte:
    artikel_copy
    nr | preis
    2 | 3.34
    3 | 1.56
    4 | 0.54


    best_position_copy
    bestellnr | artikelnr | menge
    1 | 2 | 2
    1 | 4 | 1
    2 | 3 | 10
    2 | 4 | 5


    Dein Subselect wir einen Fehler erzeugen da du mehr als einen Datenssatz wiederbekommen kannst.
    Um das zu verhindern musst du im Subselect noch auf Bestellnummer abfragen:


    Code
    update bestellung_copy 
      set bestell_total=
      (select ac.einzelpreis*bpc.bestellmenge
      from artikel_copy ac, best_position_copy bpc
      where ac.artikelnr = bpc.artikelnr AND
                  bpc.betsellnr = bestellung_copy.bestellnr
      ) ;


    Damit entfällt die WHERE im Update und es werden alle Datensätze durchgerechnet.


    SQL ist natürlich ungetestet.

  • könntest du bitte alle Spalten der Tabellen nennen? Insbesondere von Bestellung.


    Bestellung
    bestellnr
    Bestell_Total


    Bestell_Position
    bestellnr
    bestellpos
    Artikelnr
    Bestellmenge


    Artikel
    Artikelnr
    Einzelpreis

  • Artikel:
    Artikelnr, Artikelgrpnr, Artikelname, Einzelpreis


    Bestellung:
    Bestellnr, Kundencode, Bestelldatum, Lieferdatum, Bestell_total


    Best_position:
    Posnummer, Artikelnr, Bestellnr, Bestellmenge


    Aufgabenbeschreibung vlt nochmal:
    Schreibe eine Prozedur die folgendes macht: Füllen der Spalte BESTELL_TOTAL mit dem Wert der Bestellposition. (Bestellmenge*Einzelpreis).

  • Auch wenn es nicht die sauberste Lösung ist, es funktioniert:



    Code
    begin
    updateBestellTotal();
    end;
    /


    // Du müsstest ja eigtl über die Bestellungen iterieren ... aber das bekommste schon hin.

  • Funktionieren tuts, ja


    allerdings erstmal nur mit SQL, dann mit PLSQL.


    Ich kann das Problem vlt nochmal einschränken...


    derzeit bin ich soweit

    Code
    update best_position_copy artikel 
    set zeilen_summe = (select ac.einzelpreis*bsp.bestellmenge as best_total from artikel_copy ac, best_position_copy bsp where bsp.artikelnr = ac.artikelnr and bsp.posnummer = bsp.posnummer and bsp.bestellnr=bsp.bestellnr);


    Das problem ist eben das, dass ich das SET zeilen_summe (was ja nur eine Zeile ist) mit meinem subselect welcher eben auf genau 4.999 Zeilen besteht updaten will.


    Problem ist also folgendes:
    Ich muss mein update durch irgend eine eindeutige Bedingung so festlegen, dass ich die ganze Spalte zeilen_summe update, nicht nur eine Zeile davon.

  • OMG!
    Ein fucking halber Tag rum und ich hab genau ein Problem gelöst...


    Lösung:

    SQL
    UPDATE best_position_copy bpos SET (bpos.zeilen_summe) = ( SELECT (ac.einzelpreis * bpos2.bestellmenge) AS zeilensumme FROM best_position_copy bpos2 JOIN artikel ac ON ac.artikelnr = bpos2.artikelnr WHERE bpos2.bestellnr = bpos.bestellnr AND bpos2.posnummer = bpos.posnummer);


    sogar noch eine zweite Lösung, eine noch performantere Lösung:


    Code
    update best_position_copy bsp
    set bsp.zeilen_summe = bsp.bestellmenge * (select ac.einzelpreis from artikel_copy ac where bsp.artikelnr = ac.artikelnr);