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;

WITH EmpsCTE AS
(
SELECT EmployeeID, ReportsTo, FirstName, LastName
FROM dboEmployees
WHERE EmployeeID = 5
UNION ALL
SELECT EMPEmployeeID, EMPReportsTo, EMPFirstName, EMPLastName
FROM EmpsCTE AS MGR
JOIN dboEmployees AS EMP
ON EMPReportsTo = MGREmployeeID
)
SELECT FROM EmpsCTE;
这就是一个使用CTE的一个查询,你看一下吧

概念说不一定理解,给你一个例子你自己参悟。 SELECT TEACHER FROM C AS X WHERE UNIQUE(SELECT TEACHER FROM C AS Y WHERE YTEACHER=XTEACHER);


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

原文地址: https://outofmemory.cn/yw/13352889.html

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

发表评论

登录后才能评论

评论列表(0条)

保存