谁能用sql语句(2008)帮我实现这种查找排序,关于产品BOM单的 20

表名:product_bom,最主要的两个字段:parent_item、child_item,这两个字段是父子关系,首先parent_item是产品编号(第一层),对应的... 表名:product_bom,最主要的两个字段:parent_item、child_item,这两个字段是父子关系,首先parent_item是产品编号(第一层),对应的child_item就是产品下的大部件(第二层),然后parent_item是大部件编号时(第二层),对应的child_item就是小部件编号(第三层),一直下去,现在加入表中是这样的数据:
parent_item child_item
#11 1
#11 2
#11 3
1 1.1
1 1.2
2 2.1
2 2.2
3 3.1
1.1 1.1.1
1.1.1 1.1.1.1
2.1 2.1.1
2.1 2.1.2

查询出来的结果应该是:
层次 内部序号 编号
1 1 1
2 1 1.1
3 1 1.1.1
4 1 1.1.1.1
2 2 1.2
1 1 2
2 1 2.1
3 1 2.1.1
3 2 2.1.1
1 1 3
2 1 3.1
用文字描述下:产品编号是已知的,根据条件:parent_item=产品编号(#11),得到的第一层(1/2/3),然后按照parent_item=1来查找,如果有1.1(第二层)的话,再继续找,一直找到没有,如果有1.2再找1.2,找完1的再找2。。。。。。循环下去
意思是这样,但我不知道怎么用sql语句来实现。请大侠们帮忙,我的分数不多但是全部了,感激不尽,如果描述不清晰我会回答的,在线等
哪怕高手很肯定的说sql语句是实现不了的也行啊,我可以用别的语言实现,但效率相当低下,所以看sql能解决不,如果解决不了那就算了,希望你大侠们能很负责任的给我答复
展开
 我来答
百度网友2f686ca21
2012-08-07 · 超过15用户采纳过TA的回答
知道答主
回答量:57
采纳率:0%
帮助的人:43.2万
展开全部
查询出来的结果应该是:
层次 内部序号 编号
1 1 1
2 1 1.1
3 1 1.1.1
4 1 1.1.1.1
2 2 1.2
1 1 2 //你应该写错了,内部序号应该是2
2 1 2.1
3 1 2.1.1
3 2 2.1.1 //你应该写错了,编号应该是2.1.2
1 1 3 //你应该写错了,内部序号应该是3
2 1 3.1

从上面的规律看来
1、整个结果的排序是按“编号”来排列的
2、层次:“编号”的小数点个数+1,也就是child_item的小数点个数加1,你自己想个办法吧,这个在保存product_bom 表时记录到表中就更好了

百度到个好办法:
len(child_item) - len( replace(child_item, '.' , '') ) + 1
3、内部序号:“编号”的最后一位,当然你也可以用parent_item 来截取child_item

select len(child_item) - len( replace(child_item, '.' , '') ) + 1
,right(child_item,1) 内部序号, child_item
from product_bom
order by child_item
追问
这位大侠,你看的非常仔细,也都明白了,数据是临时捏造的,填的时候没有核对。但有一点不是你想的那样,是我没表达好。我澄清一下:查询结果中的“编号”是“child_item”或者“parent_item“的值,是不需要去生成1.1.1.1这样的数据的,是查询的时候从parent_item或者child_item字段中抓过来的。我只是为了方便理解,故意捏造这样的数据。其次是希望能有一个完整的查找语句,非常谢谢你
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
景联文科技
2024-06-11 广告
一、什么是数据标注?1. 数据标注定义数据标注是对未经处理的语音、图片、文本、视频等数据进行加工处理, 并转换为机器可识别信息的过程。原始数据一般通过数据采集获得, 随后的数据标注相当于对数据进行加工, 然后输送到人工智能算法和模型里完成调... 点击进入详情页
本回答由景联文科技提供
End灬琦琦
2012-08-07 · TA获得超过956个赞
知道小有建树答主
回答量:181
采纳率:0%
帮助的人:196万
展开全部
oracle行么,这是树形结构查找,然后排序,进行BOM结构的展开,我把Oracle代码给你,要是需要plsql的,你自己变换一下吧~

使用 start with ...connect by prior,就很容易了

SELECT substr(rpad('. ', 2*(LEVEL-1), '. ')||LEVEL, 1, 50) "lvl" --这个就是类似那个1.1.1的显示方式,你可以自己组合,随意变换成你想要的形式
LEVEL LEL, --这个单纯显示是属于第几层的
PARENT_ITEM, --上级code
CHILD_ITEM, --下级code
ROWNUM ROW_NO
FROM TABLE1
START WITH PARENT_ITEM='#11' --从#11开始
CONNECT BY PRIOR CHILD_ITEM=PARTENT_ITEM --下级item为下下级item的上级
and level < 5 --这个可以限定展开层次数
order by rownum --具体要依照什么排序,根据你的需要来
;
追问
非常谢谢你的回答,虽然知道了你的思路,但两种语言的实现方法差距还是挺大的,因为我对sql复杂的语法和函数都还不精通,所以我很难自己转换过来,还是非常谢谢你的回答。对了,我看到你说类似1.1.1.1那样的显示方式,我没有这个要求的,只要把编号(parent_item或者child_item的值)显示出来就好了,那些数据我是为了方便理解捏造出来的,你只要知道父子关系就好了
追答
你等等,我再给你该,sql肯定可以,但是需要自己写函数,我好久没写sql,不太顺手,别着急哈~
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
carlxu2010
2012-08-07 · 超过10用户采纳过TA的回答
知道答主
回答量:37
采纳率:0%
帮助的人:29.2万
展开全部
select level,t.* from product_bom t
START WITH parent_item='#11'
CONNECT BY PRIOR child_item=parent_item
更多追问追答
追问
首先非常感谢您的回答,但我没看到你是怎么得到层次(level)、内部序号的值,这都是必须要的,要一条语句全部实现。还是很感谢你,你的好像也是oracle,sql好像没这个功能啊
追答
level这个字段是自动计算的,还有你的内部序号,第1,6,10行应该不是1吧,应该是#11。另外这个确实是oracle的,没看清提问,不好意思了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式