//SQL SqlServer:CTE函数处理递归(WITH语法) cte可以其他名字 注意匹配(所有cte全部替换)
with cte as
(
select a.typeid,a.superid,a.typename from ctype a where typeid=1
union all
select k.typeid,k.superid,k.typename from ctype k inner join cte c on c.typeid = k.superid
)select * from cte
//MYSQL 放到命令行执行
CREATE FUNCTION `getChildDeptLst`(rootId INT)
RETURNS varchar(1000)
BEGIN
DECLARE sTemp VARCHAR(1000);
DECLARE sTempChd VARCHAR(1000);
SET sTemp = '$';
SET sTempChd =cast(rootId as CHAR);
WHILE sTempChd is not null DO
SET sTemp = concat(sTemp,',',sTempChd);
SELECT group_concat(id) INTO sTempChd FROM department where FIND_IN_SET(parentId,sTempChd)>0;
END WHILE;
RETURN sTemp;
END
select getChildLst(1);
select * from departmentg where FIND_IN_SET(id, getChildDeptLst(1));
//
//查询子项父id
SELECT T2.id, T2 .name FROM ( SELECT @r AS _id, (SELECT @r := parentId FROM department WHERE id = _id) AS parentId, @l := @l + 1 AS lvl FROM (SELECT @r := 30, @l := 0) vars, department h WHERE @r <> 0) T1 JOIN department T2 ON T1._id = T2.id ORDER BY T1.lvl DESC
执行查询或者命令行报错
创建function时
出错信息:
ERROR 1418 (HY000): This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you *might* want to use the less safe log_bin_trust_function_creators variable)
原因:
这是我们开启了bin-log, 我们就必须指定我们的函数是否是
1 DETERMINISTIC 不确定的
2 NO SQL 没有SQl语句,当然也不会修改数据
3 READS SQL DATA 只是读取数据,当然也不会修改数据
4 MODIFIES SQL DATA 要修改数据
5 CONTAINS SQL 包含了SQL语句
其中在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。
在MySQL中创建函数时出现这种错误的解决方法:
set global log_bin_trust_function_creators=TRUE;
下面部分摘自
http://hi.baidu.com/alovn/blog/item/590412157d0c0c04972b43ce.html
分享到:
相关推荐
这将返回所有子节点的 ID,包括直接子节点和间接子节点。 第二种方法:使用存储过程来实现递归查询 该方法是使用 MySQL 的存储过程来实现递归查询。首先,创建一个存储过程 `sp_getChildNodes`,该过程将递归地...
本文通过对比两种MySQL递归树查询方法——使用自连接和递归联合以及利用变量和循环,详细分析了它们各自的实现原理及适用场景。在实际应用中,根据具体需求和数据特点选择合适的方法至关重要。希望本文能为开发人员...
MySQL 中进行递归查询有两种常见的方式:一种是使用存储过程,另一种则是利用 SQL 函数来实现递归。 #### 二、通过存储过程实现递归查询 ##### 方法一:存储过程实现递归查询 **存储过程定义:** ```sql CREATE ...
在提供的`mysql递归调用获取树节点(子树).doc`文档中,应该详细解释了这个过程,包括如何创建和执行存储过程,以及如何使用提供的测试数据。确保查看文档以获取完整的步骤和示例,以便在实际项目中成功应用这些...
这里,我们将深入探讨如何使用递归查询来构建菜单树,并特别关注在MySQL和Oracle这两种广泛使用的数据库系统中的实现。 首先,我们要理解什么是递归查询。递归查询是一种在数据库中处理层次数据的方法,它通过自身...
通过上述分析,我们可以看出MySQL递归查询结合Java代码能够高效地构建出树形结构。这种方法不仅适用于MySQL,对于其他支持递归查询的数据库也同样适用。在实际项目开发中,合理利用递归查询能够极大地简化对层次结构...
- **解释**: 从`pid = '1001'`的节点开始,递归查询所有父节点的信息,同时包括该节点的第一代子节点和所有父节点(包括起始节点)。 **总结**: - `PRIOR`位于子节点端时,执行的是向下递归查询; - `PRIOR`位于父...
本文将探讨如何使用SQL函数实现三种常见的递归查询:找到所有子节点、查找所有父节点以及面包屑导航数据。我们将通过一个名为`Region`的示例表来说明这些操作。 首先,我们需要一个基础的表结构,如`Category`或`...
首先,我们需要理解数据库中的“父节点”和“子节点”的概念。 在层次数据模型中,每个节点可以有一个或多个子节点,而一个子节点只有一个父节点。这种关系通常用于表示组织结构、文件系统或分类等。在数据库中,...
使用递归删除树形结构的所有子节点(java和mysql实现) ...使用递归删除树形结构的所有子节点可以使用 Java 和 MySQL 实现,前者使用 Map 存储树形结构的数据,而后者使用递归查询删除所有子节点。
为了遍历树状表的子节点和父节点,我们需要借助其他策略,例如存储过程。 这里介绍的解决方案是通过创建两个自定义函数——`getChildList`和`getParentList`——来实现递归查询。这两个函数都是基于WHILE循环和`...
因此在这里采用类似递归的方法对菜单的所有子节点进行查询。 准备 创建menu表: CREATE TABLE `menu` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '菜单id', `parent_id` int(11) DEFAULT NULL COMMENT '父...
虽然MySQL在处理常规数据操作和查询方面表现出色,但在某些特定功能上,如递归查询,与Oracle和SQL Server等商业数据库相比,存在一定的局限性。在MySQL中,没有内置的递归查询语句,通常需要借助存储过程或存储函数...
这里我们将探讨如何通过一条SQL语句来实现MySQL的递归查询。 首先,我们需要一个包含层级关系的表格,例如名为`treenodes`的表格,包含字段`id`(节点ID)、`nodename`(节点名称)和`pid`(父节点ID)。为了演示...
在MySQL中,实现树状所有子节点的查询并非像Oracle那样可以直接使用Hierarchical Queries和`CONNECT BY`语句。然而,尽管MySQL不直接支持这样的功能,我们仍然可以通过其他方法来达到相同的效果。以下将详细介绍几种...
然而,MySQL的标准SQL语法并不直接支持递归查询,因此我们需要借助存储过程或自定义函数来实现这一功能。本文将详细介绍如何通过自定义函数在MySQL中实现递归查询父级ID和子级ID。 首先,我们需要一个表示层级关系...
在这个场景下,我们需要遍历树的每个节点,通过递归方式计算子节点的金额并累加到父节点上。 3. **深度优先搜索(DFS)**:一种常用的遍历或搜索树的方法,沿着树的深度尽可能深地搜索树的分支。在这个问题中,我们...
为了查询特定节点的所有子节点,我们使用了两个存储过程:`showChildLst` 和 `createChildLst`。这两个存储过程协同工作,递归地查找并收集指定节点的所有后代。 1. `showChildLst` 是主入口,接收一个参数 `rootId...
总结来说,这个例子展示了如何使用MySQL的存储过程和递归方法来获取树形结构中某个节点及其所有子节点的信息。这种方法适用于数据量不大且层级不深的树结构,但如果树结构过于庞大,可能会导致性能问题,因为递归...