Schleifen in SQL?
Ich habe eine Tabelle, in der es verschiedene Namen und Codes gibt. Manchmal gibt es zum gleichen Namen verschiedene Codes. Die Tabelle sieht so aus:
Anna | CodeX Anna | CodeY
Ich will eine View erstellen, die wenn der gleiche Name mit verschiedenen Codes vorkommt, in die Zelle des Namen die Anzahl angibt, wie oft der Name bisher schon vorkam.
Die View sollte das anzeigen: Anna_1 | CodeX Anna_2 | CodeY
Hierbei besteht für mich die Schwierigkeit, dass das Programm mitzählen soll, wie oft hier im Beispiel der Name Anna vorkommt und daraufhin die Zahlen „_1“ bis „_n“ an den Namen anfügt.
Ich benutze Oracle SQL Version 10 Redundanz ist hier ausgeschlossen, d.h. es gibt nie den gleichen Datensatz zweimal.
Danke für jede Hilfe :)
1 Antwort
Vorausgesetzt ich verstehe dich richtig und deine Tabelle sieht etwa so aus:
CREATE TABLE `namen` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(45),
`code` varchar(45),
PRIMARY KEY (`ID`)
);
dann solltest du hiermit zum Ziel kommen:
SELECT
if(name != @temp , @rownum := 1, @rownum := @rownum + 1) AS nm,
@temp := name AS temp,
name,
code,
concat(name, '_', @rownum)
FROM (SELECT @rownum := 0) AS ROWNUM, namen
ORDER BY name;
Ich ermittle alle Datensätze der Tabelle und sortiere nach Namen, jetzt bilden alle Datensätze mit gleichen Namen einen Block. Die Variable rownum wird einfach bei jedem Datensatz hochgezählt, aber nur, wenn sich der Namen ändert, sonst wieder auf 1 zurück gesetzt. Daher speichere ich auch den gerade ermittelten Namen in der Variablen temp zwischen.
Naja und concat setzt dir einfach den Namen neu zusammen, so wie du es beschrieben hast.
ich wusste gar nicht, dass SQL sölche konstrukte zulässt aber man lernt nie aus. DH