sql存储过程用递归

sql存储过程用递归,第1张

表结构:
sale_area销售分区表
PK#area_id
class_id
gonghao
prod_class产品分类表
PK#class_id
class_name
问题sql语句:
select distinct paclass_id from prod_class As pa,prod_class As pb,sale_area where pbclass_id in(select sale_areaclass_id from sale_area where sale_areagonghao=<param>) and paclass_id like pbclass_id||'%'
问题定义:
根据传入的参数gonghao来确定对应的class_id集,然后遍历这个class_id集,并“扩充”这个集合
要理解“扩充”必须知道class_id是这样设等级
0为最高级
|_01
| |_011
| |_012
|_02
|_011
|_012
那么拥有等级0的话,所有的等级都应该可以访问,拥有等级01的话,011、012也可以访问。
这句sql的目的就是得到当前员工能访问的所有产品分类及它的子集。
通过自连接的做法在Oracle里是对的,在DB2里就错,原因在于DB2中谓词like两边至少有一个是字符串,也就是说DB2不认为pbclass_id||'%'是字符串。
求解:
要完成上面的任务有什么可替代的办法或改进的地方,注意环境是DB2 UDB 72。
---------------------------------------------------------------
就是树的问题。
使用公共表达式可以完成。
你在信息中心里面按recusion去搜索,可以找到递归sql的写法。
---------------------------------------------------------------
问题写的很清楚,我喜欢!
如果要使用DB2的公共表达式建议你把
prod_class产品分类表结构改一下
PK#class_id
class_name
Parent_Class_id
sql语句如下:
with temp_class_id( class_id,class_name)
(
select pcclass_id,pcclass_name from prod_class pc
where pcclass_id in (select sale_areaclass_id from sale_area
where sale_areagonghao=<param>)
union
select pcclass_id,pcclass_name from prod_class pc,
temp_class_id tc
where pcparent_id = tcclass_id)
select from temp_class_id;

查询父类ID为6的所有子类信息
select from classinfo a start with classid=6
connet prior by classid=parentid

sys_connect_by_path函数是为了配合递归查询的函数,递归查询可以参考我之前的博客: >

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

原文地址: http://www.outofmemory.cn/yw/13396139.html

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

发表评论

登录后才能评论

评论列表(0条)

保存