xyhqqaa 发表于 2013-11-1 11:18:55

关于SQL多层次查询

本帖最后由 xyhqqaa 于 2017-9-22 09:29 编辑

新手初学SQL。求教万能的大神。
假如我有个表
。。
结构图

假如我想获取表结构的最底阶。假如按照这例子,我想要求出(车把,车胎,车链)并得出他们对应的数量应该是(1,2,20*2=40条)。。
目前获取最底阶用

但是刚学,对获取数量实在转过不弯。求指教。。

bob 发表于 2013-11-1 11:18:56

你所谓的结构图应该要在sql表中体现出来
简单定义产品属性,如自行车是产成品,车架车轮是半成品,而车把、车胎及车链可定义为原材料

要找最底层的,只需找原材料就行,这样SQL的开销也小
学好SQL,不是要学好如何写出复杂的表达式,而是要设计出来好的数据表!

kingfirekkk 发表于 2013-11-2 14:05:01

帮你顶上去,我也比较好奇,这东东与AU3完全无关,建议去查MYSQL的帮助文件应该好些。

auto 发表于 2013-11-3 12:17:22

回复 1# xyhqqaa


    车架有两个轮,你的结构图怎么变一个了,关系说明不明确。。你的关系自行车-》车把。车把的下级没有没有了。而你举例说明车把。车胎。车链。无法从你提供的数据递归出关系。。

nmgwddj 发表于 2013-11-4 00:34:20

请把问题描述详细,或者把几张表截图发上来,然后再模拟一个你需要的结果。

小凯 发表于 2013-11-4 14:13:59

做个唯一标识,然后用唯一标识去判断数据的关系!!应该跟部门树形图是一个道理...

只要关系清楚了,数量计算就不是问题,,SQL语句不清楚的,可以在程序里面换算嘛!!

kk_lee69 发表于 2013-11-6 00:35:46

這是 BOM 的解法吧網上有這個資料的不過有點複雜就是了

kk_lee69 发表于 2013-11-6 00:39:13

試試看這個範例看你可以理解嗎??
*****範例二   有深度   依照階層 展開..................計算用量

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)

kk_lee69 发表于 2013-11-6 00:41:41

除非 你的 BOM 有固定階層可以不用寫函數 算的出來.....不然通常要寫函數 才可以計算 不限階層的BOM

卫和谐 发表于 2013-11-6 10:48:42

跟着围观学习 一下。
页: [1]
查看完整版本: 关于SQL多层次查询