2016-05-12 52 views
0

我在进行层次结构查询时遇到问题。层次结构SQL服务器加入两个不同的表

我有MS SQL数据库如下:

表A - 订单与订单代码,物品,数量:有文章集的引用

OP | ART | QTY 

A | X |100 
B | Y |200 

表B,但文章可以制成其他物品,如果存在一个孩子的引用(可能需要去3级深):

ART | ART2 |QTY 

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

我想是这样的:

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 

我已经做了一两件事:

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 

但现在我不知道如何加入量与表A也不如何运行此查询第一表中的所有项目。

任何人都可以帮助我吗?

非常感谢!

+0

为了使响应者更容易,请让SQL小提琴http://sqlfiddle.com/ – Alex

回答

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

的A和B表是几乎相同的。我从他们那里做了一个简化它。之后,我们使用递归创建树,最后使用左连接从树中只获取树叶。