[MSSQL] Hilfe bei selbstreferenzierender Tabelle

Fragenfrager

Erfahrenes Mitglied
Hallo zusammen,

ich bin dazu verdammt worden, eine selbstreferenzierende Tabelle auszuwerten.
In dieser stehen (unter anderem) Benutzernamen, -nummern und -gruppen.
Ich möchte eine Liste, in welchen Benutzergruppen ein Benutzer ist.
Üblicherweise würde ich die Tabelle mit sich selbst JOINen, doch so einfach ist es nicht:
In der Zeile des Benutzers gibt es nur ein Feld, in der alle Gruppen stehen. In dem Feld stehen die Gruppennummern, durch Komma getrennt, manchmal ist ein Plus davor.
Handelt es sich um eine Gruppe, so ist die Spalte "GRUPPEN" leer und der Name beginnt mit WO[Leerzeichen]
Konkret sähe das so aus:
BENUTZERID | NAME | GRUPPEN
1 | Klaus | 900,+902, 002,

2 | Standardgruppe |

3 | Heinz | 002,+900,715,

900 | WO Hauptstraße |

902 | WO Teststraße

Wie bekomme ich nun das Ergebnis:
Klaus, Standardgruppe, WO Hauptstraße, WO Teststraße ?

Und nein: Ich habe mir die Struktur nicht ausgedacht und kann sie auch nicht ändern.
 
Da hat jemand ein schönes Ei gelegt.
An RegExp kommt man da fast nicht vorbei

SQL:
select usr.*, grg.benutzerid as gruppenid, grg.name as gruppenname
from tbl12 usr, tbl12 grg
where grg.gruppen is null
and usr.gruppen is not null
and usr.gruppen regexp concat('[[:<:]]', lpad(grg.benutzerid, 3, '0') ,'[[:>:]]')
order by usr.benutzerid, grg.benutzerid
Code:
BENUTZERID | NAME  | GRUPPEN        | gruppenid | gruppenname
----------------------------------------------------------------
         1 | Klaus | 900,+902, 002, |   2       | Standardgruppe
         1 | Klaus | 900,+902, 002, | 900       | WO Hauptstraße
         1 | Klaus | 900,+902, 002, | 902       | WO Teststraße
         3 | Heinz | 002,+900,715,  |   2       | Standardgruppe
         3 | Heinz | 002,+900,715,  | 900       | WO Hauptstraße
 
Ganz passt es leider noch nicht
Code:
In der Nähe von 'REGEXP' wurde ein nicht boolescher Ausdruck in einem Kontext angegeben, in dem eine Bedingung erwartet wird.
 
Was passt noch nicht?
Mein Test sieht so aus, wie ich denke, dass dein Resultat aussehen sollte.
 
Den Fehler habe ich gepostet:
In der Nähe von 'REGEXP' wurde ein nicht boolescher Ausdruck in einem Kontext angegeben, in dem eine Bedingung erwartet wird.
 
Oder halt wirklich ohne RegExp. Ist aber nicht nett
Hier ist meine Spielwiese mit MS SQL Server 2017: http://sqlfiddle.com/#!18/63393/35
SQL:
select
  usr.*, grp.*
from
  (
    select
      t.*,
      ','+replace(replace(replace(t.GRUPPEN, '+', ''), '-', ''), ' ', '') +',' as LIST
    from tbl12 t
    where t.GRUPPEN is not null
  ) usr,
  (
    select t.BENUTZERID as GRP_ID,
      t.NAME as GRP_NAME,
      '%,'+right(concat(replicate('0', 3),t.BENUTZERID), 3)+',%' as SEARCH
    from tbl12 t
    where t.GRUPPEN is null
  ) grp
where
  usr.LIST like grp.SEARCH
;
 
In dem Fall geht es (leider) nicht um Schönheit. Danke, das Skript passt soweit.
BTW: Ich hasse reguläre Ausdrücke....
 
Zurück