SQL Schleifen Abfrage

BooBaer

Neuer Benutzer
Beiträge
2
Guten Morgen zusammen,

als Quereinsteiger in diese Materie stoße ich gerade an meine Grenzen und hoffe das Ihr mir hierweiterhelfen könnt.

Folgende Tabelle als Voraussetzung:

RECIDFULLNAME
1069Aldi
1070Lidl
1075Edeka
1076Kaufland

Mein Ziel ist, mithilfe einer SQL Query die Spalte "FULLNAME" zu anonymisieren. Sprich in der Spalte sollte dann nur noch Discounter 1, Discounter 2, Discounter 3 und Discounter 4 stehen.

Ich habe versucht das ganze über eine Schleife zu lösen, mein Problem hierbei ist aber die Spalte RECID. Die Werte in dieser Spalte sind zwar eindeutig aber leider nicht fortlaufend.

Mit meinem aktuellem Lösungsansatz - siehe unten - scheitere ich genau daran, dass die Schleife aufgrund der nicht fortlaufenden RECID 8x durchläuft und ich somit nicht das gewünschte Ergebnis erhalte.

SQL:
DECLARE @Counter BIGINT,
        @MaxId BIGINT,
        @FULLNAME NVARCHAR(120),
        @RECID BIGINT
SELECT  @Counter = min(RECID) , @MaxId = max(RECID)
        FROM BLUESTAR_MANUFACTURER
 
WHILE(@Counter IS NOT NULL
      AND @Counter <= @MaxId)
BEGIN
    SELECT @FULLNAME = FULLNAME, @RECID = RECID
    FROM BLUESTAR_MANUFACTURER WHERE RECID = @Counter AND EXISTS (SELECT RECID FROM BLUESTAR_MANUFACTURER)
 
    PRINT @FULLNAME + ' ' + CONVERT(VARCHAR,@RECID)
      
    SET @Counter  = @Counter  + 1
      
END

Um besser damit "spielen" zu können, habe ich mich für eine PRINT Ausgabe anstelle eines UPDATE entschieden, bitte lasst euch dadurch nicht beirren.

Habt Ihr ein Idee bzw. könnt Ihr mir verraten wie ich zu meinem Ziel komme?
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.848
SQL in Schleifen ist prinzipiell und grundlegen eine falsche Idee.

Code:
edb=*# select * from boobaer ;
  id  | fullname 
------+----------
 1069 | Aldi
 1070 | Lidl
 1075 | Edeka
 1076 | Kaufland
(4 rows)
edb=*# with x as (select id, row_number() over (order by id) from boobaer) update boobaer set fullname = 'Discounter ' || row_number::text from x where boobaer.id=x.id;
UPDATE 4
edb=*# select * from boobaer ;
  id  |   fullname   
------+--------------
 1069 | Discounter 1
 1070 | Discounter 2
 1075 | Discounter 3
 1076 | Discounter 4
(4 rows)

edb=*#
 

dabadepdu

Datenbank-Guru
Beiträge
1.123
Es gibt keine SQL Schleifen, niemals.

Was Du konstruiert hast ist eine Schleife ja. Die ist programmiert und hat nichts mit SQL zu tun.
Innerhalb der Schleife würdest Du nun einzelne Records updaten unter verwendung einer spezfischen Where Clause, die eine Einschränkung auf die PK ID des aktuellen Datensatzes.

Dieses Vorgehen ist möglich, aber niemals wünschenswert, da es sehr langsam ist und u.U. mit etwas Pech auch "halbfertige" Transaktionen hinterlässt.

Was Du möchtest:
Ein Select Statement konstruieren, dass minimal ID und zukünftigen Feldwert der Spalte liefert.
Das dient der Findung der Datenmenge und der Kontrolle der Update Inhalte.
Das Select wird dann zu einem korrelierten Update umgebaut. Das ist ein einziges Statement, das alle Datensätze aktualisiert.

Randthema: Das Erzeugen eines einzigartigen anonymisierten Namens muss nicht durch eine fortlaufende Zahl erfolgen, es kann eine zufällige sein oder ein zufälliger Text.
 
Werbung:
Oben