SQL SQL Update aus derselben Tabelle

winscheil

Cadet 2nd Year
Registriert
Apr. 2017
Beiträge
17
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?
 
Verknüpf dein Subselect mit deinem Update-Statement.
Dein Subselect wird immer den selben Wert bekommen, wegen Top1.
 
vielen Dank schon mal.
Das mit dem Top 1 leuchtet mir jetzt ein.
Aber das andere mit den Subselect verstehe ich nicht genau.
Kannst du mir den update Befehl hinschreiben?
 
sollte so in der Art funktionieren, habe leider grade keinen MS SQL Server da zum testen bzgl. der Syntax

update TABELLE t
set t.AUFTRAG = (select kalk.AUFTRAG from ANP_FT_KALK_LIEFRECH_MA kalk where t.RECHNUNG = kalk.RECHNUNG and kalk.AUFTRAG is not null)
where t.AUFTRAG IS NULL;
 
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.
 
Du musst beiden Tabellen (auch wenn's die selben sind) einen unterschiedlichen Alias geben. Im WHERE des Selects einfach a.rechnungsnummer = b.rechnungsnummer.

edit: dann gibt dein Select mehrere Werte zurück. Weiter einschränken, distinct oder top1 benutzen etc.pp.

Sind das Hausaufgaben oder einfach nur keine Ahnung von SQL? Dann lieber mal die Grundlagen lernen.
 
Zuletzt bearbeitet:
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.
 
Falsche UPDATE Syntax.

UPDATE t1
SET t1.columnInt = 123
FROM schema.table1 t1
JOIN.... WHERE...
 
jetzt hat es funktioniert:

update ANP_FT_KALK_LIEFRECH_MA
set AUFTRAG = (select Top 1 SUB.AUFTRAG
from ANP_FT_KALK_LIEFRECH_MA AS SUB
where SUB.LIEFRECHNUNG = MAIN.LIEFRECHNUNG and SUB.AUFTRAG is not null)
FROM ANP_FT_KALK_LIEFRECH_MA AS MAIN
where MAIN.AUFTRAG IS NULL
 
@Enurian
Kann man pauschal nicht sagen. Deine Syntax klappt bei mir z.B. nicht.
Die Syntax die winscheil benutzte allerdings schon.

Code:
update redruck a set zeitstempel = (select first 1 zeitstempel from redruck b where b.rechnungsnummer = a.rechnungsnummer+1)

klappt bei mir wunderbar (mal abgesehen vom Sinn des Statements xD)
 
Mit einer common table expression wird das ganze leichter und leserlicher:

Code:
WITH CTE AS
(
SELECT Auftrag, Rechnung
FROM MyTable
WHERE Auftrag IS NOT NULL
GROUP BY Auftrag, Rechnung
)
UPDATE MyTable SET Auftrag = CTE.Auftrag
FROM CTE
WHERE MyTable.Rechnung = CTE.RECHNUNG
AND MyTable.Auftrag IS NULL
 
Zuletzt bearbeitet:
Zurück
Oben