Ⅰ sql用什么方法可以实现递归函数
在 SQL 中,你可以使用递归查询来实现递归函数。递归查询是一种查询,其中结果集由一条或多条 SELECT 语句和察埋一条用于查找败碧蚂下一级行的 UNION ALL 语句组成。
例如,假设你有一张表,其中包含父子关系的信息(即,每个记录都有一个父级 ID,表示它的父级),你可以使用以下递归查询来查询每个记录的慧郑所有祖先:
WITH RECURSIVE ancestors AS (
-- 初始查询
SELECT id, parent_id
FROM your_table
WHERE id = :your_id
UNION ALL
-- 递归查询
SELECT t.id, t.parent_id
FROM your_table t
INNER JOIN ancestors a ON t.id = a.parent_id
)
SELECT id FROM ancestors;
在这个查询中,我们使用了一个递归关系,其中第一个 SELECT 语句是初始查询,用于查询给定 ID 的记录。第二个 SELECT 语句是递归查询,用于查询与当前记录的父级相关的记录。通过将这两个 SELECT 语句用 UNION ALL 连接起来,我们就可以获得所有祖先的列表了。
Ⅱ sql 2000 递归查询
with tt(select 语句1 --初始化
union all
select 语句2)
select * from tt
在select 语句2中from的表里关联with后面的表名tt就形成递推了。
Ⅲ Linq To Sql 如何实现递归查询 树形结构
--构造测试数据: 只作演示用
CREATE TABLE [dbo].[Tim_LinqTable](
[Id] int PRIMARY KEY IDENTITY(1,1) NOT NULL,
[Name] [varchar](50) NOT NULL,
[Parent] int NOT NULL,
)
GO
INSERT INTO [Tim_LinqTable]
SELECT 'A',0 UNION ALL
SELECT 'A1',1 UNION ALL
SELECT 'A2',1 UNION ALL
SELECT 'B1',2 UNION ALL
SELECT 'B2',3 UNION ALL
SELECT 'C1',4 UNION ALL
SELECT 'C2',4 UNION ALL
SELECT 'D1',5 UNION ALL
SELECT 'D2',5 UNION ALL
SELECT 'D3',5
GO
WITH temp
AS
(
SELECT * FROM [Tim_LinqTable] WHERE Parent = 3
UNION ALL
SELECT m.* FROM [Tim_LinqTable] AS m
INNER JOIN temp AS child ON m.Parent = child.Id
)
SELECT * FROM temp
GO
--查询 Parent=3 的所有子数据结果如下罩闹:
Id Name Parent
----------- -------------------------------------------------- -----------
5 B2 3
8 D1 5
9 D2 5
10 D3 5
(4 row(s) affected)
//好中键,下物培罩边来看看用C#怎么实现上边的SQL语句吧:
void Main()
{
var query=GetClassID(3);
Console.WriteLine("Id\tName\tParent");
query.ToList().ForEach(q=>Console.WriteLine("{0}\t{1}\t{2}",q.Id,q.Name,q.Parent));
/*
Id Name Parent
5 B2 3
8 D1 5
9 D2 5
10 D3 5
*/
}
public IEnumerable<Tim_LinqTable> GetClassID(int p_id)
{
var query = from c in this.Tim_LinqTables
where c.Parent == p_id
select c;
return query.ToList().Concat(query.ToList().SelectMany(t => GetClassID(t.Id)));
}
Ⅳ SQL树形层级查询
你好的!
oracle 的start with connect by
别的数据库用cte 递归都能达到你要的效果!
望采纳~
Ⅳ sql 树形结构递归查询问题 求助求助求助
简单示例
createtableTree
(
IDintidentity(1,1)primarykeynotnull,
Namevarchar(20)notnull,
Parentvarchar(20)null
)
go
insertTreevalues('大学',null)
insertTreevalues('学院','大学')
insertTreevalues('计算机学院','学院')前芹
insertTreevalues('网络工程','计算机学袭行院')
insertTreevalues('信息管理','计算机学院')
insertTreevalues('电信学院','学院')
insertTreevalues('教务处','大学')
insertTreevalues('材料科','教务处')
insertTreevalues('招生办','大学')
go
withCTEas
(
-->Begin一个定位点成员
selectID,Name,Parent,cast(Nameasnvarchar(max))asTE,
-->End
unionall
-->Begin一个递归成员
selectTree.ID,Tree.Name,Tree.Parent,cast(replicate('',len(CTE.TE))+'|_'+Tree.nameasnvarchar(MAX))asTE,Levle+1asLevle
慧禅毕fromTreeinnerjoinCTE
onTree.Parent=CTE.Name
-->End
)
select*fromCTEorderbyID
Ⅵ sql 怎么递归查询的方法:
1.创建测试表,createtabletest_connect(idnumber,p_idnumber);
Ⅶ sql语句实现递归查询所有节点,mysql和oracle都能用的
首先说一下Oracle的递归查询,相信大部分人都知道很简单。无非start with connect by 函数。下面是从pId向子节点递归查询的例子,unId是数据库表中的主键。
如果是从子节点递归到父节点查询,就把start with 换成unid,prior左右对换
下面再讲MySql 的递归查询方式。MySql没有Oracle的强大功能,虽然都是同一个公司的产品。所以只能靠自己写。有很多方法,用sql去循环查询,或者写存储过程,我这里只提供一种。就是新建一个function函数。
表结构不说了,无非就是 Id ,pId,其他列。下面是创建一个递归查询子节点的函数
DROP FUNCTION IF EXISTS queryChildrenPowerInfo;
CREATE FUNCTION `queryChildrenPowerInfo` (powerId VARCHAR(2000))
RETURNS VARCHAR(2000)
BEGIN
DECLARE sTemp VARCHAR(2000);
DECLARE sTempChd VARCHAR(2000);
SET sTemp = '$';
SET sTempChd = cast(powerId as CHAR);
WHILE sTempChd is not NULL DO
SET sTemp = CONCAT(sTemp, ',', sTempChd);
SELECT group_concat(id) INTO sTempChd FROM t_discretionary_power where FIND_IN_SET(pId,sTempChd)>0;
END WHILE;
return sTemp;
调用的时候:select queryChildrenPowerInfo(""); 该语句会返回Id和父Id等于传入参数powerId的一个字符串,中间有逗号隔开如图
下面这句代码的意思是,查询出 t_discretionary_power 表中,t.id 等于上面查询出的结果集的数据。FIND_IN_SET(A,B)是MYSQL的函数。意思是查找在B集合中有A的数据。相当于In
select t.* from t_discretionary_power t where FIND_IN_SET(t.id,queryChildrenPowerInfo(''))