2016-05-12 5 views
0

Ich habe ein Problem beim Erstellen einer Hierarchieabfrage.Hierarchie-SQL-Server, der zwei verschiedene Tabellen verbindet

Ich habe folgendes in MS SQL-DB:

Tabelle A - Aufträge mit Bestellcode, Artikel, Menge:

OP | ART | QTY 

A | X |100 
B | Y |200 

Tabelle B mit Montage Referenzen der Artikel, sondern Gegenstände können aus gemacht werden andere Artikel, wenn es ein Kinderreferenz existieren (kann 3 Ebenen tief gehen müssen):

ART | ART2 |QTY 

X | U | 20 
X | O | 10 
X | Z | 30 
Y | Q | 20 
Y | W | 15 
Y | E | 30 
U | Z | 10 

Und ich möchte so etwas bekommen:

A.OP |LEVEL| ART | B.ART2 |QTY 
A  | 2 | X | Z  |(100*20*10)=2000 
A  | 1 | X | O  |(100*10) =1000 
A  | 1 | X | Z  |(100*30) = 3000 
B  | 1 | Y | Q  |(200*20) = 4000 
B  | 1 | Y | W  |(200*15) = 3000 
B  | 1 | Y | E  |(200*30) = 6000 
B  | 1 | Y | Z  |(200*10) = 2000 

Ich habe schon eine Sache gemacht:

WITH X AS (
SELECT 
firstlvl.ART, 
1 AS LEVEL, 
firstlvl.ART2, 
firstlvl.QTY, 
QTY AS PARENTQTY 
FROM B AS firstlvl 
WHERE firstlvl.ART='X' 
UNION ALL 
SELECT secondlevel.ART, 
EL.LEVEL +1, 
secondlevel.BDT_MLC, 
secondlevel.ART2, 
secondlevel.QTY, 
EL.PARENTQTY AS PARENTQTY 
FROM B AS secondlevel 
INNER JOIN X AS EL 
ON secondlevel.ART = EL.ART2) 
SELECT * FROM X 

Aber jetzt weiß ich nicht, wie Mengen mit Tabelle A zu verbinden, noch wie diese Abfrage für alle Elemente auf dem ersten Tisch laufen.

Kann mir bitte jemand helfen?

Vielen Dank!

+0

Um es für Responder einfacher zu machen, machen Sie bitte eine SQL Fiddle http://sqlfiddle.com/ – Alex

Antwort

0
with AllData as 
(select op as art, art as art2, qty from a 
union all 
    select * from b), 
Tree(RootLvl, Father, Child, qty, lvl) as (
select art, art, art2, qty, 0 from AllData 
where art in ('A' , 'B') 
union all 
select C.RootLvl, C.Child, AllData.art2, AllData.qty * c.qty, C.lvl + 1 from Tree C 
join AllData 
on C.Child = AllData.art 
) 
select C1.RootLvl as OP, C1.Lvl, C1.Child, C1.Qty from Tree c1 
left join Tree c2 
on c1.child = c2.father and 
    c1.rootLvl = c2.RootLvl 
where C2.RootLvl is null 
order by 1, 2 desc 

SQL Fiddle demo

Die A- und B-Tische sind fast gleich. Ich habe eins von ihnen gemacht, um es einfach zu vereinfachen. Danach verwenden wir Rekursion, um einen Baum zu erstellen, und am Ende benutze ich den linken Join, um nur Blätter vom Baum zu bekommen.