none
SQL Update aus derselben Tabelle RRS feed

  • Frage

  • Hallo, ich habe folgendes Problem.

    Ich habe eine Tabelle die folgendermaßen aufgebaut ist.

    Auftrag Rechnung Position Artikel Kosten
    NULL 8010445 1 1234 120,00
    206404 8010445 2 4567 50,00
    206404 8010445 3 8901 300,00
    NULL 8009999 1 1234 100,00
    206531 8009999 2 7634 20,00
    206531 8009999 3 8723 40,00

    Es sind Rechnungspositionen, die normal einem Auftrag zugeordnet sind, nur ein Artikel (123) nicht.
    Alle Rechnungspositionen der selben Rechnung sind immer dem selben Auftrag zugeordnet.
    Bei der Auswertung, z.B. Summenbildung mit Groupierung auf die Aufträge, geht dann dieser Artikel verloren, da hier die Spalte Auftrag nicht gefüllt ist sondern NULL drin steht.

    Ich möchte jetzt diese Tabelle updaten und in den Zeilen, bei denen dieser Artikel (123) auftaucht und das Feld Auftrag leer ist, den Eintrag aus dem Feld Auftrag aus einer anderen dazugehörigen Rechnungsposition nehmen und eintragen.

    Mit genau einer Rechnung kann ich es:

    update TABELLE
    set AUFTRAG = (select Top 1 AUFTRAG from ANP_FT_KALK_LIEFRECH_MA where RECHNUNG = '8010445' and AUFTRAG is not null)
    where AUFTRAG IS NULL and RECHNUNG = '8010445'


    Aber ich schaffe es nicht auf die ganze Tabelle anzuwenden.
    Wenn ich die Einschränkung (where) auf genau eine Rechnung entferne steht immer die selbe Auftragsnummer in den gefüllten Feldern.
    Kann mir hier jemand helfen?
    Mittwoch, 5. April 2017 08:32

Antworten

  • Mit der TOP 1 Anweisung liefert die Unterabfrage nur 1 Ergebnis, da sollte keine Fehlermeldung kommen.

    Mit dem DISTINCT können mehrere Ergebnisse kommen, wenn eine Rechnung nun eben doch nicht nur zu einem, sondern mehreren Aufträgen gehört; eine Sammelrechnung. Da wäre nun die Business Logic wichtig, welche Nummer in dem Fall zu nehmen ist.

    Ein Alias definiert man in der FROM Klausel, Du hast es beim UPDATE und das löst den Syntax Fehler aus; siehe mein SQL Statement.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 5. April 2017 09:11
  • Hallo,

    Indem Du in der Unterfrage auf die Rechnungsnummer aus der äußeren Abfrage referenzierst, hier in fett dargestellt:

    update MAIN
    set AUFTRAG = (select Top 1 SUB.AUFTRAG 
                   from ANP_FT_KALK_LIEFRECH_MA AS SUB
                   where SUB.RECHNUNG = MAIN.Rechnung and SUB.AUFTRAG is not null)
    FROM ANP_FT_KALK_LIEFRECH_MA AS MAIN
    where MAIN.AUFTRAG IS NULL

    Wenn Du auf gleiche Tabellen zugreifst, dann immer Aliase verwenden, hier MAIN und SUB.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Mittwoch, 5. April 2017 08:37

Alle Antworten

  • Hallo,

    Indem Du in der Unterfrage auf die Rechnungsnummer aus der äußeren Abfrage referenzierst, hier in fett dargestellt:

    update MAIN
    set AUFTRAG = (select Top 1 SUB.AUFTRAG 
                   from ANP_FT_KALK_LIEFRECH_MA AS SUB
                   where SUB.RECHNUNG = MAIN.Rechnung and SUB.AUFTRAG is not null)
    FROM ANP_FT_KALK_LIEFRECH_MA AS MAIN
    where MAIN.AUFTRAG IS NULL

    Wenn Du auf gleiche Tabellen zugreifst, dann immer Aliase verwenden, hier MAIN und SUB.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]


    Mittwoch, 5. April 2017 08:37
  • vielen Dank schon mal.

    da bringt er mir dann folgende Fehlermeldung:

    Die Unterabfrage hat mehr als einen Wert zurückgegeben. Das ist nicht zulässig, wenn die Unterabfrage auf =, !=, <, <=, > oder >= folgt oder als Ausdruck verwendet wird.

    Mittwoch, 5. April 2017 08:48
  • so sieht mein aktueller Befehl aus:

    update ANP_FT_KALK_LIEFRECH_MA
    set ANP_FT_KALK_LIEFRECH_MA.auftrag= (select distinct k.auftrag from ANP_FT_KALK_LIEFRECH_MA k where ANP_FT_KALK_LIEFRECH_MA.liefrechnung = k.LIEFRECHNUNG and k.auftrag is not null)
    where ANP_FT_KALK_LIEFRECH_MA.auftrag is null

    ich kann nach dem update der Tabelle kein Alias geben, da bringt er mir einen Fehler.
    Darum habe ich bei dem Subselect ein Alias vergeben und ansonsten ANP_FT_KALK_LIEFRECH_MA.auftrag (Tabelle.Feld)
    benutzt.

    Mit Aliase überall:
    update ANP_FT_KALK_LIEFRECH_MA t1
    set t1.auftrag= (select distinct k.auftrag from ANP_FT_KALK_LIEFRECH_MA k where t1.liefrechnung = k.LIEFRECHNUNG and k.auftrag is not null)
    where ANP_FT_KALK_LIEFRECH_MA.auftrag is null

    Fehlermeldung:
    Meldung 102, Ebene 15, Status 1, Zeile 1
    Falsche Syntax in der Nähe von 't1'.
    Meldung 156, Ebene 15, Status 1, Zeile 3
    Falsche Syntax in der Nähe des where-Schlüsselworts.
    Mittwoch, 5. April 2017 08:54
  • Mit der TOP 1 Anweisung liefert die Unterabfrage nur 1 Ergebnis, da sollte keine Fehlermeldung kommen.

    Mit dem DISTINCT können mehrere Ergebnisse kommen, wenn eine Rechnung nun eben doch nicht nur zu einem, sondern mehreren Aufträgen gehört; eine Sammelrechnung. Da wäre nun die Business Logic wichtig, welche Nummer in dem Fall zu nehmen ist.

    Ein Alias definiert man in der FROM Klausel, Du hast es beim UPDATE und das löst den Syntax Fehler aus; siehe mein SQL Statement.


    Olaf Helper

    [ Blog] [ Xing] [ MVP]

    Mittwoch, 5. April 2017 09:11
  • jetzt hab ich es verstanden.

    hat funktioniert.

    vielen Dank!

    Mittwoch, 5. April 2017 09:20