以下两段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中:每删除一条数据都有可能造成OM_ORGANIZATION_QUERY_CHILDREN ('1')这个函数的执行结果变化,

假设删除第一条的时候,这个函数的执行结果是【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结束。不仅提高了效率,还避免了错误。

最新文章

  1. linux上使用google身份验证器(简版)
  2. GUID简介
  3. Js控制iFrame切换加载网址
  4. POJ1941 The Sierpinski Fractal
  5. 界面控件 - 滚动条ScrollBar
  6. 子元素div高度不确定时父div高度如何自适应
  7. Linux Terminal 控制终端的使用
  8. Java反射 - 2(对象复制,父类域,内省)
  9. 跟我学系列教程——《13天让你学会Redis》火热报名中
  10. 关键部分CCriticalSection使用
  11. GreenPlum学习之(Share-nothing)架构
  12. 动态添加删除网卡 - 每天5分钟玩转 OpenStack(156)
  13. 树莓派控制GPIO(Python)
  14. CSS深入理解学习笔记之absolute
  15. java中获取项目在tomcat目录下的路径方法
  16. Java基础学习笔记三 Java基础语法
  17. 虚拟机linux挂载光盘显示:mount: you must specify the filesystem type
  18. IntelliJ IDEA 报错:找不到包或者找不到符号
  19. ubutu16.04 安装Tenda u12无线网卡驱动
  20. Codeforces 40 E. Number Table

热门文章

  1. selenium谷歌火狐插件安装
  2. 使用layer弹窗和layui表单做新增功能
  3. Electron 5.0 发布
  4. ifconfig命令返回找不到“-bash: ifconfig: command not found”
  5. opencv-python用原图和mask实现抠图
  6. Codeforces1238F. The Maximum Subtree(树形dp)
  7. 二叉树中序遍历,先序遍历,后序遍历(递归栈,非递归栈,Morris Traversal)
  8. VS2015加载错误的解决办法
  9. Idea集成使用SVN教程
  10. Codeforces Round #606 Div. 2 比赛总结