Benutzer mit den meisten Antworten
SQL Update aus derselben Tabelle

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?
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]- Als Antwort vorgeschlagen Stefan FalzModerator Mittwoch, 5. April 2017 11:53
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 13. April 2017 12:58
-
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]- Bearbeitet Olaf HelperMVP Mittwoch, 5. April 2017 08:38
- Als Antwort vorgeschlagen Christoph Muthmann Mittwoch, 5. April 2017 08:48
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 13. April 2017 12:58
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]- Bearbeitet Olaf HelperMVP Mittwoch, 5. April 2017 08:38
- Als Antwort vorgeschlagen Christoph Muthmann Mittwoch, 5. April 2017 08:48
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 13. April 2017 12:58
-
-
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. -
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]- Als Antwort vorgeschlagen Stefan FalzModerator Mittwoch, 5. April 2017 11:53
- Als Antwort markiert Ivan DragovMicrosoft contingent staff, Moderator Donnerstag, 13. April 2017 12:58