UPDATE Spalte mit zufälligen Werten aus anderer Tabelle

miwu_2605

Neuer Benutzer
Beiträge
3
Hallo zusammen,
ich möchte eine Spalte in einer Tabelle aktualisieren. Das Feld soll "anonymisiert" werden. In dem Feld soll aus einer Menge von Werten aus einer anderen Tabelle ein zufälliger Wert gewählt und geschrieben werden.

Momentan habe ich das Problem, dass zwar ein zufälliger Wert ausgesucht wird, dieser aber dann in allen geupdateten Datensätzen gleich ist. Ich möchte natürlich, dass der Wert pro Zeile neu zufällig gewählt wird.

Wie bekomme ich das hin?
Mein momentaner Code:

UPDATE L2001.VERTRAG
SET
BESCHSCHL = (SELECT TOP 1 LIT_KZL FROM L2001.LITERAL WHERE LIT_ART = 'BESALS' AND SPR = 'D' ORDER BY NEWID() );


Vielen Dank für Eure Hilfe!
 
Werbung:
Worin besteht der Sinn einen zufälligen Wert einzutragen, kann die Spalte nicht einfach NULL sein?

In deinem Fall liefert newid() genau einmal eine ID und sortiert nach diesem "festen" Wert. Effektiv gibt es also keine Sortierung und TOP 1 wird einen beliebigen Wert (keinen zufälligen) zurückliefern. Verändert sich die Tabelle nicht, wird es vermutlich immer der selbe Wert sein.

Hinzu kommt, das dein Subselect zur Ermittlung des Wertes auch nur einmal ausgeführt wird, um dann alle Werte der Spalte mit diesem Wert zu belegen, also quasi alles nur nicht zufällig :)

Wieviele LIT_KZL Werte gibt es deinn in LITERAL und wieviele Datensätze hat VERTRAG, stimmt die Anzahl überein? Soll jeder Wert nur einmal zugeordnet werden?
 
Leider darf die Spalte lt. Anforderung nicht NULL sein.

Entsprechende LIT_KZL sind es knapp 5.000, Verträge ca. 800. Die Anzahl stimmt nicht überein (muss auch nicht). Jeder Wert kann auch mehrfach zugeordnet werden, Hauptsache zufällig. :)

Hast du ne Idee?
 
Nun, wenn mehrere den gleichen Wert haben dürfen, warum dann nicht auch alle?

Idee (ungetestet):
Code:
DECLARE    @pk UNIQUEIDENTIFIER
SET        @pk = (    SELECT    TOP 1 pk
                FROM    VERTRAG
                WHERE    BESCHSCHL IS NULL )

WHILE @pk IS NOT NULL
BEGIN
    UPDATE    L2001
    SET        L2001.BESCHSCHL = (
        SELECT    t.LIT_KZL
        FROM    (
        SELECT    row_number() OVER (ORDER BY id) AS zeilennr,
                LIT_KZL
        FROM    LITERAL
        ) t
        WHERE    t.zeilennr = round(( SELECT count(*) FROM LITERAL ) * rand(),0)
    )
    WHERE    pk = @pk

    SET        @pk = (    SELECT    TOP 1 pk
                    FROM    VERTRAG
                    WHERE    BESCHSCHL IS NULL )
END

PS: PK ist der Primärschlüssel von VERTRAG und kann natürlich auch ein anderes Format haben als UNIQUEIDENTIFIER.
 
Werbung:
danke erstmal dafür
habe es noch nicht getestet.

aber mit meiner oben stehende zeile habe ich genau das, also dass alle gleich sind. zwar zufällig ein wert ausgewählt wird, aber für alle zeilen der gleiche. genau das möchte ich (bzw. der kunde) aber nicht haben.
 
Zurück
Oben