oppermann
Goto Top

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?

Content-Key: 282146

Url: https://administrator.de/contentid/282146

Printed on: April 25, 2024 at 07:04 o'clock

Member: MadMax
MadMax Sep 07, 2015 at 10:56:45 (UTC)
Goto Top
Hallo Oppermann,

hierachische Strukturen bekommst Du mit CTEs aufgelöst:
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