找回密码
 加入
搜索
查看: 6881|回复: 9

[系统综合] 关于SQL多层次查询

  [复制链接]
发表于 2013-11-1 11:18:55 | 显示全部楼层 |阅读模式
悬赏20金钱已解决
本帖最后由 xyhqqaa 于 2017-9-22 09:29 编辑

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

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

但是刚学,对获取数量实在转过不弯。求指教。。
附件: 您需要 登录 才可以下载或查看,没有账号?加入

最佳答案

查看完整内容

你所谓的结构图应该要在sql表中体现出来 简单定义产品属性,如自行车是产成品,车架车轮是半成品,而车把、车胎及车链可定义为原材料 要找最底层的,只需找原材料就行,这样SQL的开销也小 学好SQL,不是要学好如何写出复杂的表达式,而是要设计出来好的数据表!
发表于 2013-11-1 11:18:56 | 显示全部楼层
你所谓的结构图应该要在sql表中体现出来
简单定义产品属性,如自行车是产成品,车架车轮是半成品,而车把、车胎及车链可定义为原材料

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

评分

参与人数 1金钱 +10 收起 理由
xyhqqaa + 10 谢谢,您想的情况跟我这边的一致,我没说清 ...

查看全部评分

发表于 2013-11-2 14:05:01 | 显示全部楼层
帮你顶上去,我也比较好奇,这东东与AU3完全无关,建议去查MYSQL的帮助文件应该好些。

评分

参与人数 1金钱 +10 收起 理由
xyhqqaa + 10 谢谢。自己已经搞的差不多了。谢谢帮顶

查看全部评分

发表于 2013-11-3 12:17:22 | 显示全部楼层
回复 1# xyhqqaa


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

评分

参与人数 1金钱 +10 收起 理由
xyhqqaa + 10 谢谢。我描述不清楚。。对不起

查看全部评分

发表于 2013-11-4 00:34:20 | 显示全部楼层
请把问题描述详细,或者把几张表截图发上来,然后再模拟一个你需要的结果。

评分

参与人数 1金钱 +10 收起 理由
xyhqqaa + 10 恩恩。。描述不清楚,给您照成麻烦不好意思

查看全部评分

发表于 2013-11-4 14:13:59 | 显示全部楼层
做个唯一标识,然后用唯一标识去判断数据的关系!!应该跟部门树形图是一个道理...

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

评分

参与人数 1金钱 +10 收起 理由
xyhqqaa + 10 谢谢。。。想法跟您的差不多,谢谢!!

查看全部评分

发表于 2013-11-6 00:35:46 | 显示全部楼层
這是 BOM 的解法吧  網上有這個資料的  不過有點複雜就是了
发表于 2013-11-6 00:39:13 | 显示全部楼层
試試看  這個範例  看你可以理解嗎??
*****範例二   有深度   依照階層 展開..................計算用量

Create table [bom]([父件編碼] 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)

评分

参与人数 1金钱 +30 收起 理由
xyhqqaa + 30 good,我用的方法跟您的差不多。但是刚学不 ...

查看全部评分

发表于 2013-11-6 00:41:41 | 显示全部楼层
除非 你的 BOM 有固定階層  可以不用寫函數 算的出來.....不然通常要寫函數 才可以計算 不限階層的BOM
发表于 2013-11-6 10:48:42 | 显示全部楼层
跟着围观学习 一下。
您需要登录后才可以回帖 登录 | 加入

本版积分规则

QQ|手机版|小黑屋|AUTOIT CN ( 鲁ICP备19019924号-1 )谷歌 百度

GMT+8, 2024-12-24 08:41 , Processed in 0.075441 second(s), 22 queries .

Powered by Discuz! X3.5 Licensed

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表