chgs2011
Goto Top

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:

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

Content-ID: 395627

Url: https://administrator.de/contentid/395627

Ausgedruckt am: 08.11.2024 um 07:11 Uhr

sabines
sabines 14.12.2018 um 07:36:05 Uhr
Goto Top
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:


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
SlainteMhath
SlainteMhath 14.12.2018 um 08:34:43 Uhr
Goto Top
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
chgs2011
chgs2011 14.12.2018 aktualisiert um 08:39:26 Uhr
Goto Top
Moin,

ja dachte ich auch, aber der INNER JOIN macht Probleme, da die Meldung 512 kommt:

Meldung 512
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.


Ich möchte Änderungen in tAdresse machen, muss aber das Erstelldatum als Datumsbereich aus tKunde ziehen.

Jetzt habe ich das Problem, dass in der Tabelle tAdresse der Kunde mit kKunde = '125' gleich 3 Adressen hat.
SQL Update kann als die Änderung nicht durchführen, da keine eindeutige Zeile bekannt ist.

Ich möchte ja ALLE Zeilen ändern, muss also wohl mein UPDATE-Befehl erweitern, daran scheitere ich aber.

P.S. habe oben die Tabelle erweitert, hatte ich vergessen
sabines
sabines 14.12.2018 um 08:47:35 Uhr
Goto Top
Was für eine Methode und welcher SQL ist das?
Funktioniert der Befehl im Managemeint Studio, falls es MS SQL ist.
WinCobold
WinCobold 14.12.2018 um 09:12:49 Uhr
Goto Top
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:

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
chgs2011
chgs2011 14.12.2018 um 09:33:31 Uhr
Goto Top
Es betrifft MS-SQL 2016 Standard, habe Infos oben auch nochmals ergänzt.

@WinCobold
Danke, werde ich versuchen, ich meine es aber auch so versucht zu haben.
Ich denke es wird ebenfalls Fehler 512 werfen, denn auch hier werden mehrere Zeilen sicherlich gemeldet.

@sabines
Ich habe in MS SMS diese Abfragen gebaut, SELECT läuft ja, es werden mehere Zeilen geliefert, UPDATE läuft nicht, weil UPDATE keine mehrere Zeilen mit gleicher ID mag.

Ich verzweifel langsam, es muss doch möglich sein ALLE Zeilen zu ändern von Kunde X.
sabines
sabines 14.12.2018 aktualisiert um 10:41:35 Uhr
Goto Top
Moin,

ich hab' mal gutes Karma gesammelt und das nachgebaut, es funktioniert (dein Ursprungs Update Befehl).
Poste mal deine Tabellen, rechstklick, skript als create in.

Gruss
chgs2011
chgs2011 14.12.2018 um 11:00:34 Uhr
Goto Top
Die Tabellen sind sehr umfangreich, müsste diese dann erst mal aufräumen (Datenschutz).

Was hat denn bei dir funktioniert? Mein UPDATE mit MS SQL? Kann ich mir gerade nicht vorstellen.
SlainteMhath
SlainteMhath 14.12.2018 um 11:26:04 Uhr
Goto Top
Die Tabellen sind sehr umfangreich, müsste diese dann erst mal aufräumen (Datenschutz).
Script CREATE erzeugt nur ein Script mit der Datenstruktur, aber ohne Daten...
sabines
sabines 14.12.2018 um 11:26:10 Uhr
Goto Top
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.

CREATE TABLE [dbo].[tAdresse](
	[kAdresse] [varchar](50) Not NULL,
	[kKunde] [varchar](50) NULL,
	[cSumme] [numeric](18, 0) NULL
	PRIMARY KEY (kAdresse)
) ON [PRIMARY]

GO
MadMax
MadMax 14.12.2018 aktualisiert um 13:08:27 Uhr
Goto Top
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
chgs2011
chgs2011 14.12.2018 aktualisiert um 15:46:39 Uhr
Goto Top
NEEEEIIIINNN ... es tut mir leid, ich hab den Fehler gefunden.
Ein Trigger hatte einen Fehler geworfen, der per INSUPDEL die Tabelle überwacht und mit mehrdeutigen Zeilen ein Problem hatte!
chgs2011
chgs2011 16.12.2018 um 11:25:58 Uhr
Goto Top