Rekursion / Stücklisten mit SQL-Server 2005

24/04/2008 - 07:31 von lange.patrick | Report spam
Hallo Zusammen,

ich habe da ein kleines Problem. Ich hoffe Ihr könnt mir dabei
weiterhelfen.

Ich besitze einte Tabelle namens Kasse. Diese Tabelle besitzt folgende
Spalten:
* Kassen_ID (eindeutig)
* Kassenname
* ID_Mutterkasse (ID der Mutterkasse)

Nun möchte ich gerne zu einer bestimmten Kasse die übergeordneten und
untergeordneten Kassen angezeigt bekommen.

Die Root Kasse hat die ID_Mutterkasse = NULL.

Wie mache ich dies unter dem SQL Server 2005 (SQL Syntax)?

Vielen Dank
Gruß
Patrick
 

Lesen sie die antworten

#1 Christoph Ingenhaag
24/04/2008 - 10:04 | Warnen spam
"" wrote:

Hallo Zusammen,

ich habe da ein kleines Problem. Ich hoffe Ihr könnt mir dabei
weiterhelfen.

Ich besitze einte Tabelle namens Kasse. Diese Tabelle besitzt folgende
Spalten:
* Kassen_ID (eindeutig)
* Kassenname
* ID_Mutterkasse (ID der Mutterkasse)

Nun möchte ich gerne zu einer bestimmten Kasse die übergeordneten und
untergeordneten Kassen angezeigt bekommen.

Die Root Kasse hat die ID_Mutterkasse = NULL.

Wie mache ich dies unter dem SQL Server 2005 (SQL Syntax)?

Vielen Dank
Gruß
Patrick



Hi Patrick

schau dir das mal an:

set nocount on

go

create table #Kasse
(
Kassen_ID int primary key not NULL
,Kassenname varchar(100) not NULL
,ID_Mutterkasse int
)
go
create index idx_#Kasse_ID_Mutterkasse on #Kasse(ID_Mutterkasse) include
(Kassen_ID, Kassenname)
go

insert into #Kasse select 1, '1', NULL
insert into #Kasse select 2, '2', 1
insert into #Kasse select 3, '3', 1
insert into #Kasse select 4, '4', 2
insert into #Kasse select 5, '5', 2
insert into #Kasse select 6, '6', 3
insert into #Kasse select 7, '7', 3
insert into #Kasse select 8, '8', 4
insert into #Kasse select 9, '9', 5
insert into #Kasse select 10, '10', 6
go

declare @kassen_ID int
set @kassen_ID = 10 -- change here

;with kassenHierarchieDown as
(
select
1 Row
,Kassen_ID
,Kassenname
,ID_Mutterkasse
,cast(Kassen_ID as varchar(max)) Pfad
from #Kasse
where
ID_Mutterkasse is NULL

union all

select
Row + 1 Row
,K.Kassen_ID
,K.Kassenname
,K.ID_Mutterkasse
,H.Pfad + '-' + cast(K.Kassen_ID as varchar(max))
from #Kasse K
inner join kassenHierarchieDown H
on
K.ID_Mutterkasse = H.Kassen_ID
),
kassenHierarchieUp as
(
select
0 Row
,Kassen_ID
,Kassenname
,ID_Mutterkasse
,cast(Kassen_ID as varchar(max)) Pfad
from #Kasse
where
Kassen_ID = @kassen_ID

union all

select
Row - 1 Row
,K.Kassen_ID
,K.Kassenname
,K.ID_Mutterkasse
,H.Pfad + '-' + cast(K.Kassen_ID as varchar(max))
from #Kasse K
inner join kassenHierarchieUp H
on
H.ID_Mutterkasse = K.Kassen_ID
),
kassenHierarchieMerge as
(
select
Row
,Kassen_ID
,Kassenname
,ID_Mutterkasse
,Pfad
,1 Ebene
from kassenHierarchieUp
where
Kassen_ID <> @kassen_ID
union all
select
Row
,Kassen_ID
,Kassenname
,ID_Mutterkasse
,Pfad
,2 Ebene
from kassenHierarchieDown
where
Pfad like '%' + cast(@kassen_ID as varchar(max)) + '%'
)
select
Kassen_ID
,Kassenname
,ID_Mutterkasse
,Pfad
from kassenHierarchieMerge
order by
Ebene
,Row


Wenn die Datenmenge sehr gross ist,
die Änderungsintervalle nicht klein sind
und die Tiefe der Hierarchie überschaubar ist
dann würde ich mir statt dieser Lösung eine Lösung mit regelmàßig
aufbereiteten Daten überlegen...

Vg
Christoph

Ähnliche fragen