Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

UPDATE Spalte mit zufälligen Werten aus anderer Tabelle

Dieses Thema im Forum "Microsoft SQL Server" wurde erstellt von miwu_2605, 30 Juli 2014.

  1. miwu_2605

    miwu_2605 Neuer Benutzer

    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!
     
  2. ukulele

    ukulele Datenbank-Guru

    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?
     
  3. miwu_2605

    miwu_2605 Neuer Benutzer

    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?
     
  4. ukulele

    ukulele Datenbank-Guru

    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.
     
  5. miwu_2605

    miwu_2605 Neuer Benutzer

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden