关于SQL多层次查询
本帖最后由 xyhqqaa 于 2017-9-22 09:29 编辑新手初学SQL。求教万能的大神。
假如我有个表
。。
结构图
假如我想获取表结构的最底阶。假如按照这例子,我想要求出(车把,车胎,车链)并得出他们对应的数量应该是(1,2,20*2=40条)。。
目前获取最底阶用
但是刚学,对获取数量实在转过不弯。求指教。。 你所谓的结构图应该要在sql表中体现出来
简单定义产品属性,如自行车是产成品,车架车轮是半成品,而车把、车胎及车链可定义为原材料
要找最底层的,只需找原材料就行,这样SQL的开销也小
学好SQL,不是要学好如何写出复杂的表达式,而是要设计出来好的数据表! 帮你顶上去,我也比较好奇,这东东与AU3完全无关,建议去查MYSQL的帮助文件应该好些。 回复 1# xyhqqaa
车架有两个轮,你的结构图怎么变一个了,关系说明不明确。。你的关系自行车-》车把。车把的下级没有没有了。而你举例说明车把。车胎。车链。无法从你提供的数据递归出关系。。 请把问题描述详细,或者把几张表截图发上来,然后再模拟一个你需要的结果。 做个唯一标识,然后用唯一标识去判断数据的关系!!应该跟部门树形图是一个道理...
只要关系清楚了,数量计算就不是问题,,SQL语句不清楚的,可以在程序里面换算嘛!! 這是 BOM 的解法吧網上有這個資料的不過有點複雜就是了 試試看這個範例看你可以理解嗎??
*****範例二 有深度 依照階層 展開..................計算用量
Create table ([父件編碼] nvarchar(5),[子件編碼] nvarchar(7),[用量] int)
Insert bom
Select 'a','a.1',2 union all
Select 'a','a.2',1 union all
Select 'a','a.3',2 union all
Select 'a.1','a.1.1',3 union all
Select 'a.1','a.1.2',4 union all
Select 'a.1','a.1.3',2 union all
Select 'a.2','a.2.1',2 union all
Select 'a.2','a.2.2',2 union all
Select 'a.1.1','a.1.1.1',1 union all
Select 'a.1.1','a.1.1.2',2
Go
--創建函數1
If not object_id('f_getbom1') is null
Drop function f_getbom1
Go
create function f_getbom1(@No varchar(10))
returns @t table(父件編碼 varchar(10),子件編碼 varchar(10),用量 int,lvl int)
as
begin
declare @i int
set @i=1
insert @t select *,@i from bom where 父件編碼=@No
while @@rowcount>0
begin
set @i = @i + 1
insert @t
select a.父件編碼,a.子件編碼,a.用量*b.用量,@i
from bom a,@t b
where a.[父件編碼]=b.[子件編碼]
and b.lvl=@i-1
end
return
end
go
--創建函數2
If not object_id('f_getbom2') is null
Drop function f_getbom2
Go
create function f_getbom2(@No varchar(10),@lvl int)
returns table
as
return(
select 子件編碼 as 編碼,用量
from f_getbom1(@No) a
where lvl<=@lvl
and not exists(
select 1
from f_getbom1(@No)
where lvl<=@lvl
and a.子件編碼=父件編碼)
)
go
--調用查詢
select * from f_getbom2('a',1) 除非 你的 BOM 有固定階層可以不用寫函數 算的出來.....不然通常要寫函數 才可以計算 不限階層的BOM 跟着围观学习 一下。
页:
[1]