MySql 使用递归函数时遇到的级联删除问题

以下两段SQL的写法看似相同,结果效果却是不同的

写法A​:

DELETE OM_ORGANIZATION,
OM_POSITION
FROM
OM_ORGANIZATION
LEFT JOIN OM_POSITION ON OM_POSITION.ORG_ID = OM_ORGANIZATION.ORG_ID
WHERE
FIND_IN_SET(
          OM_ORGANIZATION.ORG_ID,
          OM_ORGANIZATION_QUERY_CHILDREN ('52037b7c-0f01-41f6-849f-4f99ad8f2422')
)

这个写法多表格汇总求和是不正确的,先来介绍一下这个

OM_ORGANIZATION_QUERY_CHILDREN

函数

BEGIN
DECLARE sTemp VARCHAR(4000);
DECLARE sTempChd VARCHAR(4000);

SET sTemp = '$';
SET sTempChd = id;

WHILE sTempChd is not NULL DO
SET sTemp = CONCAT(sTemp,',',sTempChd);
SELECT group_concat(ORG_ID) INTO sTempChd FROM OM_ORGANIZATION where FIND_IN_SET(PARENT_ORG_ID,sTempChd)>0;
END WHILE;
return sTemp;
END

id​(VARCHAR(40))是这个函数的参数

这个函数的执行结果是返回一个拼起来的字符串,字符串根据主键​ORG_ID​、父节点主键​PARENT_ORG_ID​两个字段,递删除的微信好友怎么找回归查询出​OM_ORGANIZATION​中所有以传入参数作为根节点的主键,然后拼成一个类似 【1,2,3,4】的可供​FIND_IN_SET​使用的字符串(这里定义成VARCHAR(删除4000))。

写法A中:每删除一条数据递归是什么意思都有可能造成O数据库M_ORGANIZATION_QUERY_CHILDREN ('1')多表联查的sql语句这个函数的执行结果变化,

假设删除第一条的时候,这个函数的执行结果是【1,2,级联删除3】,其中’2‘删除的照片如何恢复的父节点是’1‘,’3‘的父节点也是’1‘,那么在删除完’2‘之后,函数的结删除的照片如何恢复果变成了【1,3】,而后边与’2删除和微信拉黑的区别是什么‘存在关系的OM级联是什么意思_POSITION就无法递归调用被删数据库系统掉了。

删除的短信怎么恢复确的写法应该如下:

写法B:多表合并到一张表格

DELETE OM_ORGANIZATION,
OM_POSITION
FROM
(
SELECT
ORG_ID
FROM
OM_ORGANIZATION
WHERE
FIND_IN_SET(
          OM_ORGANIZATION.ORG_ID,
          OM_ORGANIZATION_QUERY_CHILDREN ('52037b7c-0f01-41f6-849f-4f99ad8f2422')
)
) T
INNER JOIN OM_ORGANIZATION ON T.ORG_ID = OM_ORGANIZATION.ORG_ID
LEFT JOIN OM_POSITION ON OM_POSITION.ORG_ID = OM_ORGANIZATION.ORG_ID

这样,函数只执行一遍,其结果将一直保持不变,直到SQL结束。不仅提高了效率,还避免了错误。