2016-05-12 12 views
0

階層クエリを作成する際に問題があります。階層SQLサーバーが2つの異なるテーブルに結合する

表A - 注文コード、物品、数量を有するオーダー:

Iは、MS SQL DBに以下た物品のアセンブリ参照と

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 Fiddleを作成してください。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テーブルはほぼ同じです。私はそれらを単純化するためにそれらから1つを作った。その後、ツリーを作成するために再帰を使用し、最後にツリーからリーフだけを取得するために左結合を使用します。

関連する問題