mastertulle
Goto Top

Hilfe bei Update Script

Hallo,

ich habe folgendes Problem:

update [DATA].[dbo].Projekt_Details
set ProjektID (select tmp_pid
from [DATA].[dbo].KUNDEN a ,[GLOBALDATA].[dbo].Projekt_Details b
where a.KID =b.KID)

Hier erhalte ich immer eine Fehlermeldung das die Unterabfrage mehr als einen Wert zurückgegeben hat.

Zur Info:
Die ProjektID kann mehrfach vorkommen, die KID ist nur einmal vorhanden in beiden tabellen.
Der Versuch das gnze per Cursor zu machen dauert für die 24 Millionen Datensätze über 248 Tage
face-sad

Ich hoffe es kann mir jemand helfen.

Ganz liebe Grüße

Sven

Content-Key: 279885

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

Printed on: April 18, 2024 at 20:04 o'clock

Member: MadMax
MadMax Aug 11, 2015 at 16:21:54 (UTC)
Goto Top
Hallo Sven,

mal abgesehen davon, daß hinter der ProjektID das Gleichheitszeichen fehlt, solltest Du noch irgendeinen Bezug von der Unterabfrage zur Hauptabfrage herstellen. Die Abfrage "select tmp_pid from [DATA].[dbo].KUNDEN a ,[GLOBALDATA].[dbo].Projekt_Details b where a.KID =b.KID" liefert offensichtlich mehr als einen Wert zurück, aber Du willst vermutlich einen genau bestimmten davon in die ProjektID schreiben. Dieser Bezug fehlt.

Schreib doch mal Deine Lösung mit dem Cursor, dann kann man vermutlich sehen, wie die Verknüpfung sein muß.

Gruß, Mad Max
Member: ukulele-7
ukulele-7 Aug 12, 2015 updated at 06:22:02 (UTC)
Goto Top
Ich sehe hier auch mehrere "Fuschereien". Erstmal ist der Join in der Unterabfrage überflüssig, die Tabelle Projekt_Details wird auch im Update benutzt. Dann ist der Join nicht explizit, das kann schnell zu Fehlern führen. Du verwendest die Aliase a und b aber aus welcher Tabelle dann deine Spalte tmp_pid kommt, verätst du eigentlich gar nicht.

Das Gleichheitszeichen fehlt wie schon angemerkt und 24 Mio Datensätze sind nichts, das müsste auch mit Cursor eher in 248 Sekunden durch sein als in Tagen.

Probier doch mal das hier:
UPDATE	[DATA].[dbo].[Projekt_Details]
SET	ProjektID = (	SELECT	DISTINCT a.tmp_pid
			FROM	[DATA].[dbo].[KUNDEN] a
			WHERE	a.KID = [DATA].[dbo].[Projekt_Details].KID )
..aber nur wenn du weißt, was du da tust.
Member: mastertulle
mastertulle Aug 12, 2015 at 08:38:30 (UTC)
Goto Top
hallo ukulele-7

Hat funktioniert! Besten Dank. Das Update dauerte aber trotzdem 20 Minuten.

Besten Dank und Grüße Sven
Member: ukulele-7
ukulele-7 Aug 12, 2015 at 09:32:39 (UTC)
Goto Top
Dann sind deine Indexe möglicherweise nicht optimal. Wenn es sich um einen einmaligen Vorgang handelt, ist das kein Problem. Wenn du aber andere Abfragen hast die z.B. in KUNDEN nach KID suchen sollte auf dieser Spalte ein Index liegen. Man könnte auch anehmen, das sei der PK der Tabelle deswegen ist das schon sonderbar.
Member: MadMax
MadMax Aug 12, 2015 at 10:10:23 (UTC)
Goto Top
Moin,

funktioniert hat der Befehl von ukulele vermutlich, aber stimmt auch das Ergebnis? In der Problembeschreibung steht, daß die zu aktualisierende Tabelle "Projekt_Details" in der Datenbank "DATA" ist, die in der Unterabfrage verwendete Tabelle "Projekt_Details" ist aber in der Datenbank "GLOBALDATA". Und dann stimmt der Befehl von ukulele nämlich nicht mehr. Deshalb hat mich auch die Lösung mit dem Cursor interessiert, daraus könnte man die richtige Verknüpfung der Daten möglicherweise ersehen.

Gruß, Mad Max
Member: ukulele-7
ukulele-7 Aug 12, 2015 at 10:22:22 (UTC)
Goto Top
Sry der Unterschied ist mir entgangen. Dann ist ein Join im Subselect evnetuell doch nötig, das würde aber nur Sinn ergeben wenn z.B. [DATA].[dbo].[Projekt_Details].KID ungleich [GLOBALDATA].[dbo].[Projekt_Details].KID ist oder andere Bedingungen hinzukommen.