主从表的BOM怎么用递归实现

主从表的BOM怎么用递归实现,第1张

在任何制造环境中,不同的部门和系统都为不同的目的使用BOM(下文的BOM在含义上属于不同的种类,统一以BOM表达),每个部门和系统都从BOM中获取特定的数据。主要的BOM用户有:设计部门设计部门既是BOM的设计者,又是BOM的使用者。

首先说一下Oracle的递归查询,相信大部分人都知道很简单。无非start with connect by 函数。下面是从pId向子节点递归查询的例子,unId是数据库表中的主键。

如果是从子节点递归到父节点查询,就把start with 换成unid,prior左右对换

下面再讲MySql 的递归查询方式。MySql没有Oracle的强大功能,虽然都是同一个公司的产品。所以只能靠自己写。有很多方法,用sql去循环查询,或者写存储过程,我这里只提供一种。就是新建一个function函数。

表结构不说了,无非就是 Id ,pId,其他列。下面是创建一个递归查询子节点的函数

DROP FUNCTION IF EXISTS queryChildrenPowerInfo

CREATE FUNCTION `queryChildrenPowerInfo` (powerId VARCHAR(2000))

RETURNS VARCHAR(2000)

BEGIN

DECLARE sTemp VARCHAR(2000)

DECLARE sTempChd VARCHAR(2000)

SET sTemp = '$'

SET sTempChd = cast(powerId as CHAR)

WHILE sTempChd is not NULL DO

SET sTemp = CONCAT(sTemp, ',', sTempChd)

SELECT group_concat(id) INTO sTempChd FROM t_discretionary_power where FIND_IN_SET(pId,sTempChd)>0

END WHILE

return sTemp

END

调用的时候:select  queryChildrenPowerInfo("fa2528924c7e9168014c9bedfe04039c")该语句会返回Id和父Id等于传入参数powerId的一个字符串,中间有逗号隔开如图

下面这句代码的意思是,查询出 t_discretionary_power  表中,t.id 等于上面查询出的结果集的数据。FIND_IN_SET(A,B)是MYSQL的函数。意思是查找在B集合中有A的数据。相当于In

select t.* from t_discretionary_power  t where FIND_IN_SET(t.id,queryChildrenPowerInfo('fa2528924c7e9168014c9bedfe04039c'))

应该是这样:

with qry as (select user_id,parent_id from tab where user_id = 32

union all

select tab.user_id,tab.parent_id from tab,qry

where tab.parent_id = qry.id)

select * from qry

我用mysql5.0.22,不支持上述语法,oracle就可以(sqlserver应该也可以):

create table tab1(user_id int, parent_id int)

insert into tab1 values(1,null)

insert into tab1 values(32,1)

insert into tab1 values(101,32)

insert into tab1 values(102,32)

insert into tab1 values(201,101)

insert into tab1 values(202,101)

insert into tab1 values(203,102)

insert into tab1 values(204,102)

select * from tab1

with qry(user_id,parent_id) as (select user_id,parent_id from tab1 where user_id = 32

union all

select tab1.user_id,tab1.parent_id from tab1,qry

where tab1.parent_id = qry.user_id

)

select * from qry

所以,mysql没有办法了,只有写函数,用循环来实现了。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/6669091.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存