MS-SQL 2016 Standard: SQL Update mit 2 verknüpften Tabellen scheitert (Unterabfrage hat mehrere Werte)
Hallo,
ich scheitere leider an meinem Update-Befehl und suche dringend Tipps.
Ich habe 2 Tabellen, eine Tabelle für Kundeninfos und eine mit Kundenadressen.
In Tabelle tKunde steht KundenID (kKunde) und Datum der Erstellung des Kundenkontos.
In Tabelle tAdresse stehen wiederum ALLE Adressen, die der Kunde hinterlegt hat.
Hierzu ist PK kAdresse vergeben, da diese einzigartig ist, als Verweis auf das Kundenkonto steht hier tAdresse_kKunde.
Ich kann natürlich nun eine KundenID (kKunde) abfragen, erhalte auch sauber alle Adressen:
Tabelle tAdresse
Tabelle tKunde
So, diesen SELECT wollte ich nun als UPDATE umbauen, ich wollte in jede Zeile einen individuellen Wert addieren.
Update klappt aber nicht, weil es natürlich mehrere Zeilen mit kKunde gibt:
Ich hoffe es kann mir jemand helfen.
P.S. betrifft MS-SQL 2016 Standard
ich scheitere leider an meinem Update-Befehl und suche dringend Tipps.
Ich habe 2 Tabellen, eine Tabelle für Kundeninfos und eine mit Kundenadressen.
In Tabelle tKunde steht KundenID (kKunde) und Datum der Erstellung des Kundenkontos.
In Tabelle tAdresse stehen wiederum ALLE Adressen, die der Kunde hinterlegt hat.
Hierzu ist PK kAdresse vergeben, da diese einzigartig ist, als Verweis auf das Kundenkonto steht hier tAdresse_kKunde.
Ich kann natürlich nun eine KundenID (kKunde) abfragen, erhalte auch sauber alle Adressen:
SELECT tAdresse.kAdresse, tAdresse.kKunde, tAdresse.cSumme
FROM tAdresse INNER JOIN tkunde ON tkunde.kKunde = tAdresse.kKunde
WHERE (CONVERT(DATE, tkunde.dErstellt, 121) >= '2018-11-20') AND (CONVERT(DATE, tkunde.dErstellt, 121) <= '2018-11-22');
Tabelle tAdresse
kAdresse | kKunde | cSumme |
1 | 125 | 0 |
2 | 125 | 0 |
3 | 125 | 0 |
Tabelle tKunde
kKunde | cKundenNr | dErstellt |
124 | 00000275 | 2018-11-15 |
125 | 00012345 | 2018-11-21 |
126 | 00074235 | 2018-11-25 |
So, diesen SELECT wollte ich nun als UPDATE umbauen, ich wollte in jede Zeile einen individuellen Wert addieren.
Update klappt aber nicht, weil es natürlich mehrere Zeilen mit kKunde gibt:
UPDATE tAdresse
SET cSumme = (tAdresse.cSumme + 1)
FROM tAdresse INNER JOIN tkunde ON tAdresse.kKunde = tkunde.kKunde
WHERE (CONVERT(DATE, tkunde.dErstellt, 121) >= '2018-11-20') AND (CONVERT(DATE, tkunde.dErstellt, 121) <= '2018-11-22');
Ich hoffe es kann mir jemand helfen.
P.S. betrifft MS-SQL 2016 Standard
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 395627
Url: https://administrator.de/contentid/395627
Ausgedruckt am: 08.11.2024 um 07:11 Uhr
13 Kommentare
Neuester Kommentar
Zitat von @chgs2011:
So, diesen SELECT wollte ich nun als UPDATE umbauen, ich wollte in jede Zeile einen individuellen Wert addieren.
Update klappt aber nicht, weil es natürlich mehrere Zeilen mit kKunde gibt:
So, diesen SELECT wollte ich nun als UPDATE umbauen, ich wollte in jede Zeile einen individuellen Wert addieren.
Update klappt aber nicht, weil es natürlich mehrere Zeilen mit kKunde gibt:
Moin,
was genau funktioniert da nicht? Auf dem ersten Blick (07.35 ohne Kaffee) stimmt der Befehl und sollte die Summe aller Kundenadressen um 1 erhöhen.
Gruss
Moin,
würde mich @sabines anschliessen (08:30, 0,5 Tassen Kaffe). Die Fehlermeldung wäre interesssant.
Einzige Verbesserung die ich hätte, wäre im Set Befehl noch die die Tabelle dem cSumme vorstellen.
lg,
Slainte
würde mich @sabines anschliessen (08:30, 0,5 Tassen Kaffe). Die Fehlermeldung wäre interesssant.
Einzige Verbesserung die ich hätte, wäre im Set Befehl noch die die Tabelle dem cSumme vorstellen.
lg,
Slainte
Hallo chgs2011,
ich bin ja kein wirklicher DB-Spezialist, aber UPDATE mit FROM kommt mir seltsam vor.
Versuch doch mal, die Verknüpfung zu tkunde in die WHERE-Klausel zu legen, etwa so:
Gruß vom
WinCobold
ich bin ja kein wirklicher DB-Spezialist, aber UPDATE mit FROM kommt mir seltsam vor.
Versuch doch mal, die Verknüpfung zu tkunde in die WHERE-Klausel zu legen, etwa so:
UPDATE tAdresse
SET cSumme = (cSumme + 1)
WHERE kKunde in
(SELECT kKunde from tKunde
WHERE CONVERT(DATE, tkunde.dErstellt, 121) >= '2018-11-20' AND CONVERT(DATE, tkunde.dErstellt, 121) <= '2018-11-22');
Gruß vom
WinCobold
Yepp, genau Dein SQL.
Ich habe Deine Tabellen nachgebaut.
Ich will keinen Inhalt, sondern die Struktur (sagt create eigentlich schon aus) der Tabellen.
Und wenn da mehr Spalten, als die oben angegebenen sind, dann hast Du nicht alle Infos geliefert.
Ich habe Deine Tabellen nachgebaut.
Ich will keinen Inhalt, sondern die Struktur (sagt create eigentlich schon aus) der Tabellen.
Und wenn da mehr Spalten, als die oben angegebenen sind, dann hast Du nicht alle Infos geliefert.
CREATE TABLE [dbo].[tAdresse](
[kAdresse] [varchar](50) Not NULL,
[kKunde] [varchar](50) NULL,
[cSumme] [numeric](18, 0) NULL
PRIMARY KEY (kAdresse)
) ON [PRIMARY]
GO
Hallo chgs2011,
hast Du Deinen SQL Server auf dem neuesten Stand? Laut TechNet gab es da wohl mal einen Bug. Das hat sich da zwar auf SQL Server 2012 bezogen, aber man weiß ja nicht. Für mich sieht der Befehl auch richtig aus und ich vermisse außerdem auch eine Unterabfrage. Und wo keine Unterabfrage ist, kann auch keine Unterabfrage zuviele Zeilen zurückgeben. Deswegen vermute ich einen Fehler im SQL Server.
Im Übrigen würde ich die Bedingung ändern und das CONVERT auf die vorgegebenen Daten 20.11. und 22.11. anwenden. Mal abgesehen davon, daß das Datum wahrscheinlich schon als solches in der Tabelle ist und nicht mehr umgewandelt werden muß, würde das CONVERT auf alle Zeilen der Tabelle angewendet. Wenn die statischen Daten umgewandelt werden, geschieht das nur einmal.
@WinCobold:
Das mit dem FROM ist in Ordnung, das ist die T-SQL-Syntax.
Gruß, Mad Max
hast Du Deinen SQL Server auf dem neuesten Stand? Laut TechNet gab es da wohl mal einen Bug. Das hat sich da zwar auf SQL Server 2012 bezogen, aber man weiß ja nicht. Für mich sieht der Befehl auch richtig aus und ich vermisse außerdem auch eine Unterabfrage. Und wo keine Unterabfrage ist, kann auch keine Unterabfrage zuviele Zeilen zurückgeben. Deswegen vermute ich einen Fehler im SQL Server.
Im Übrigen würde ich die Bedingung ändern und das CONVERT auf die vorgegebenen Daten 20.11. und 22.11. anwenden. Mal abgesehen davon, daß das Datum wahrscheinlich schon als solches in der Tabelle ist und nicht mehr umgewandelt werden muß, würde das CONVERT auf alle Zeilen der Tabelle angewendet. Wenn die statischen Daten umgewandelt werden, geschieht das nur einmal.
@WinCobold:
Das mit dem FROM ist in Ordnung, das ist die T-SQL-Syntax.
Gruß, Mad Max