`

SQL查询子节点或父节点

 
阅读更多

查询指定节点及其所有子节点或父节点

****************************查询开始******************************
--
SQL2005 使用CTE
DECLARE @ VARCHAR(10)
SET @='栾川县'
;
WITH XiaoAi AS
(
SELECT id FROM tb WHERE [name]=@
UNION ALL
SELECT t.id FROM XiaoAi AS a INNER JOIN tb AS t ON a.id=t.pid
)
SELECT t.* FROM XiaoAi AS a LEFT JOIN tb AS t ON t.id=a.id

--SQL 2000 使用函数
IF OBJECT_ID('dbo.XiaoAi') IS NOT NULL DROP FUNCTION dbo.XiaoAi
GO
CREATE FUNCTION dbo.XiaoAi(@ VARCHAR(20))
RETURNS @t TABLE(id VARCHAR(3), pid VARCHAR(3), [name] VARCHAR(20),Level INT)
AS
BEGIN
DECLARE @level INT
SET @level=1
INSERT INTO @t SELECT *,@level FROM tb WHERE [name]=@
WHILE(@@ROWCOUNT>0)
BEGIN
SET @level=@level+1
INSERT INTO @t SELECT t.*,@level FROM tb AS t,@t AS a WHERE a.id=t.pid AND a.level=@level-1
END
RETURN
END
GO
--调用函数
SELECT id, pid,[name] from dbo.XiaoAi('栾川县')
--****************************查询结束*************************************
/*

2、查询指定节点及其所有父节点
如:已知 栾川县
得到以下结果
id pid name
---- ---- ----------
001 NULL 河南省
002 001 洛阳市
004 002 栾川县
*/
----------------------测试开始-------------------------------------------------
DECLARE @s VARCHAR(10)
SET @s='栾川县'
SELECT id, pid,[name] INTO # FROM tb WHERE [name]=@s
WHILE @@ROWCOUNT>0
BEGIN
INSERT INTO # SELECT t.id, t.pid,t.[name] FROM tb AS t
INNER JOIN # AS a ON t.id=a.pid AND t.id NOT IN(SELECT ID FROM #)
END
SELECT * FROM # ORDER BY ID
-----------------------测试结束-------------------------------------------------

IF OBJECT_ID('tb') IS NOT NULL DROP TABLE tb
GO
CREATE TABLE tb(id VARCHAR(3),pid VARCHAR(3),[name] VARCHAR(10))
GO
INSERT INTO tb SELECT '001',NULL,'河南省'
UNION ALL SELECT '002','001','洛阳市'
UNION ALL SELECT '003','001','新乡市'
UNION ALL SELECT '004','002','栾川县'
UNION ALL SELECT '005','003','长垣县'
UNION ALL SELECT '006','002','孟津县'
UNION ALL SELECT '007','004','冷水乡'
UNION ALL SELECT '008','004','叫河乡'
UNION ALL SELECT '009','008','A村'
UNION ALL SELECT '010','008','B村'
GO
/*
1、查询指定节点及其所有子节点
--如:已知 栾川县
--得到结果

id pid name
---- ---- ----------
004 002 栾川县
007 004 冷水乡
008 004 叫河乡
009 008 A村
010 008 B村
*/
分享到:
评论

相关推荐

    SQL sever 中递归查找子节点和父节点

    SQL Server 中递归查找子节点和父节点 在关系数据库管理系统中,特别是在 SQL Server 中,递归查找子节点和父节点是一种常见的操作。这种操作可以应用于树形结构的数据存储和查询中,例如组织结构、目录结构、分类...

    sql server递归子节点、父节点sql查询表结构的实例

    本文将深入探讨如何利用递归查询来获取子节点和父节点的信息。 一、查询当前部门下的所有子部门 在SQL Server中,可以使用Common Table Expression(CTE)结合递归来实现这个功能。`deptTab`是存储部门信息的表,...

    删除数据库表中的父节点以及其子节点

    要删除一个父节点及其所有子节点,我们需要进行深度优先搜索(DFS)或广度优先搜索(BFS)。这里我们采用广度优先搜索,因为这种方式可以确保先删除所有的子节点,然后再删除父节点,避免了因删除父节点导致的子节点...

    根据当前节点获取所有父节点信息

    根据当前节点获取所有父节点信息(18代)SQL根据当前节点递归遍历获取所有父节点信息,短短的SQL可以解决复杂的问题

    根据子节点的金额向上汇总所有父节点的金额

    标题中的“根据子节点的金额向上汇总所有父节点的金额”是一个典型的树形结构数据处理问题,常见于组织架构、账目统计或者数据库层次结构的数据分析。这个问题涉及到的知识点包括但不限于: 1. **树形结构**:在...

    sql查询某个parentid下的所有childid

    在数据库管理和应用开发中,经常需要查询某一特定节点下的所有子节点信息。例如,在组织结构、产品分类等层级数据管理中,我们需要获取某个父级分类的所有子分类,包括直接子分类以及其所有的后代分类。本篇文章将...

    MySQL递归查询树状表的子节点、父节点具体实现

    为了遍历树状表的子节点和父节点,我们需要借助其他策略,例如存储过程。 这里介绍的解决方案是通过创建两个自定义函数——`getChildList`和`getParentList`——来实现递归查询。这两个函数都是基于WHILE循环和`...

    Oracle 树操作(SQL查询成树菜单)

    这个查询稍微复杂一些,需要先找出节点的父节点,然后查询该父节点的兄弟节点。 9. **查询一个节点的父节点的同级节点**: 与查询兄弟节点相似,但需要找出父节点的同级节点。 10. **名称要列出名称全部路径**:...

    asp.net treeview控件动态加载数据,选中父节点和子节点处理

    - 当用户选中或取消选中某个节点时,可以通过JavaScript来触发相应的事件处理器,根据当前选中状态来进行父节点和子节点的选择状态更新。 ```javascript function CheckEvent() { var objNode = event....

    sql server 2008 递归查询所有上级或下级数据

    - **递归部分**:接下来,我们定义了递归部分,通过内部连接将`jaf_dept_structure`表与CTE本身相连,找到所有父节点对应的子节点。这里的关键在于`on t.parentid = c.deptid`这一条件,它确保了我们能够正确地向上...

    Oracle通过递归查询父子兄弟节点方法示例

    要排除各级父节点,可以使用子查询和`NOT EXISTS`: ```sql SELECT t.* FROM SYS_ORG t WHERE NOT EXISTS (SELECT 1 FROM SYS_ORG s WHERE s.parent_id = t.id) START WITH id = '101' CONNECT BY parent_id ...

    删除父节点下的子节点 存储过程版 新手需多看几遍

    删除父节点下的子节点 存储过程版 新手需多看几遍 create function dbo.aa(@i int) returns @t table(ml_id int,parent_id int,level int) as begin declare @level int set @level=0 insert into @t ...

    Oracle 树操作(SQL查询成树状菜单)

    - 解释: 这条SQL语句用于查找所有顶级父节点,即`parent_id`为空的记录。这些通常是树的根节点。 2. **查找一个节点的直属子节点**: - SQL语句: `SELECT * FROM test_tree t WHERE t.parent_id = 1;` - 解释: ...

    MySQL实现树状所有子节点查询的方法

    在MySQL中,实现树状所有子节点的查询并非像Oracle那样可以直接使用Hierarchical Queries和`CONNECT BY`语句。然而,尽管MySQL不直接支持这样的功能,我们仍然可以通过其他方法来达到相同的效果。以下将详细介绍几种...

    SQL 递归查询,并将结果集保存在临时表中

    在给定的场景中,我们需要根据一个特定的节点ID查询出该节点及其所有子节点,并将这些结果存储在一个临时表中。以下是实现这一目标的详细步骤和相关知识点: 1. **CTE(公共表表达式)**: 公共表表达式(Common ...

    sql_函数实现三种父子递归

    本文将探讨如何使用SQL函数实现三种常见的递归查询:找到所有子节点、查找所有父节点以及面包屑导航数据。我们将通过一个名为`Region`的示例表来说明这些操作。 首先,我们需要一个基础的表结构,如`Category`或`...

    通过父编码信息给子节点分组

    例如,使用`LISTAGG`函数可以将同一父节点下的所有子节点ID聚合在一起,形成一个字符串: ```sql SELECT parent_id, LISTAGG(id, ',') WITHIN GROUP (ORDER BY id) AS child_ids FROM table_name WHERE parent_...

    用SQL实现树的查询

    1. **节点的父节点信息查询** 要获取某个节点(如员工)的父节点(上级)信息,可以使用递归方法。SQL Server 2000引入了用户定义函数(UDF),这使得实现递归成为可能。下面是一个名为`GetManager`的UDF示例,它...

    sql树形数据处理示例

    本示例将深入探讨如何在SQL中处理这类数据,包括如何根据父节点查找所有子节点,以及如何指定子节点找出所有父节点。 首先,让我们假设有一个名为`employees`的表,它包含了员工的ID(`id`)、员工的名字(`name`)...

Global site tag (gtag.js) - Google Analytics