Brauche Hilfe beim Verbinden von Strings in Baumstruktur
Bitte helft mir, ich komme einfach nicht weiter.
Ich habe folgendes Problem:
Ich will eine Baumstruktur aus einem MS SQL Server auslesen und die Bezeichnungen miteinander verbinden.
Bei einer Ebene ist das kein Problem. Aber wie kann ich das dynamisch über mehrere Ebenen tun?
Tabelle:
ARTIKELKLASSE (INT)
HAUPARTIKELKLASSE (INT)
POSITION (INT)
BEZEICHNUNG (String)
Es soll am Ende folgende Bezeichnungen ausgegeben werden, verbunden durch ein "_":
Klasse1
Klasse1_Unterklasse1
Klasse1_Unterklasse2
Klasse1_Unterklasse2_Unterunterklasse1
Klasse1_Unterklasse2_Unterunterklasse2
Klasse1_Unterklasse2_Unterunterklasse3
Klasse1_Unterklasse3
Klasse1_Unterklasse3_Unterunterklasse1
...
Für zwei Ebenen habe ich folgendes Statement:
SQL SELECT A.ARTIKELKLASSE AS Stamm_ArtikelklasseNr,
A.HAUPTARTIKELKLASSE AS Stamm_ArtikelklasseTopKlasse,
A.POSITION AS Stamm_ArtikelklassePosition,
B.BEZEICHNUNG + '_' + A.BEZEICHNUNG AS Stamm_Artikelklasse
FROM ACLogicDB.dbo.HB001ARTIKELKLASSE AS A
JOIN ACLogicDB.dbo.HB001ARTIKELKLASSE AS B
ON A.HAUPTARTIKELKLASSE = B.ARTIKELKLASSE;
Wie kann ich es über mehrere Ebenen hinbekommen?
Ich habe folgendes Problem:
Ich will eine Baumstruktur aus einem MS SQL Server auslesen und die Bezeichnungen miteinander verbinden.
Bei einer Ebene ist das kein Problem. Aber wie kann ich das dynamisch über mehrere Ebenen tun?
Tabelle:
ARTIKELKLASSE (INT)
HAUPARTIKELKLASSE (INT)
POSITION (INT)
BEZEICHNUNG (String)
Es soll am Ende folgende Bezeichnungen ausgegeben werden, verbunden durch ein "_":
Klasse1
Klasse1_Unterklasse1
Klasse1_Unterklasse2
Klasse1_Unterklasse2_Unterunterklasse1
Klasse1_Unterklasse2_Unterunterklasse2
Klasse1_Unterklasse2_Unterunterklasse3
Klasse1_Unterklasse3
Klasse1_Unterklasse3_Unterunterklasse1
...
Für zwei Ebenen habe ich folgendes Statement:
SQL SELECT A.ARTIKELKLASSE AS Stamm_ArtikelklasseNr,
A.HAUPTARTIKELKLASSE AS Stamm_ArtikelklasseTopKlasse,
A.POSITION AS Stamm_ArtikelklassePosition,
B.BEZEICHNUNG + '_' + A.BEZEICHNUNG AS Stamm_Artikelklasse
FROM ACLogicDB.dbo.HB001ARTIKELKLASSE AS A
JOIN ACLogicDB.dbo.HB001ARTIKELKLASSE AS B
ON A.HAUPTARTIKELKLASSE = B.ARTIKELKLASSE;
Wie kann ich es über mehrere Ebenen hinbekommen?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 282146
Url: https://administrator.de/forum/brauche-hilfe-beim-verbinden-von-strings-in-baumstruktur-282146.html
Ausgedruckt am: 17.04.2025 um 21:04 Uhr
1 Kommentar
Hallo Oppermann,
hierachische Strukturen bekommst Du mit CTEs aufgelöst:
Das erste select im union ist die erste Ebene, im zweiten select werden dann rekursiv die weiteren Ebenen dazugelesen.
Da ich nicht weiß, was in der ersten Ebene als Hauptartikelklasse steht, kann es sein, daß Du im ersten select was anderes eintragen kannst/mußt, z.B. "where HAUPTARTIKELKLASSE is null" oder "where HAUPTARTIKELKLASSE = ARTIKELKLASSE". Und auch im zweiten select mußt Du dann die Bedingung prüfen, daß Du keine Endlosrekursion bekommst.
Je nach dem, wie tief die Rekursion sein kann bei Euch, mußt Du evtl. noch die Rekursionstiefe anpassen. Standardmäßig liegt die bei 100, kann aber durch option (maxrecursion <x>) angepaßt werden, wobei <x> die maximale Rekusionstiefe angibt.
Gruß, Mad Max
hierachische Strukturen bekommst Du mit CTEs aufgelöst:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
with Artikelklasse as (
select A.ARTIKELKLASSE,
A.HAUPTARTIKELKLASSE,
A.POSITION,
A.BEZEICHNUNG
from ACLogicDB.dbo.HB001ARTIKELKLASSE A
where not exists (select 1 from ACLogicDB.dbo.HB001ARTIKELKLASSE where ARTIKELKLASSE = A.HAUPTARTIKELKLASSE)
union all
select A.ARTIKELKLASSE,
A.HAUPTARTIKELKLASSE,
A.POSITION,
h.BEZEICHNUNG + '_' + A.BEZEICHNUNG
from Artikelklasse h
join ACLogicDB.dbo.HB001ARTIKELKLASSE A on A.HAUPTARTIKELKLASSE = h.ARTIKELKLASSE)
select ARTIKELKLASSE AS Stamm_ArtikelklasseNr,
HAUPTARTIKELKLASSE AS Stamm_ArtikelklasseTopKlasse,
POSITION AS Stamm_ArtikelklassePosition,
BEZEICHNUNG AS Stamm_Artikelklasse
from Artikelklasse
order by BEZEICHNUNG
Das erste select im union ist die erste Ebene, im zweiten select werden dann rekursiv die weiteren Ebenen dazugelesen.
Da ich nicht weiß, was in der ersten Ebene als Hauptartikelklasse steht, kann es sein, daß Du im ersten select was anderes eintragen kannst/mußt, z.B. "where HAUPTARTIKELKLASSE is null" oder "where HAUPTARTIKELKLASSE = ARTIKELKLASSE". Und auch im zweiten select mußt Du dann die Bedingung prüfen, daß Du keine Endlosrekursion bekommst.
Je nach dem, wie tief die Rekursion sein kann bei Euch, mußt Du evtl. noch die Rekursionstiefe anpassen. Standardmäßig liegt die bei 100, kann aber durch option (maxrecursion <x>) angepaßt werden, wobei <x> die maximale Rekusionstiefe angibt.
Gruß, Mad Max