当前位置:首页 » 编程语言 » sql语句递归查询

sql语句递归查询

发布时间: 2022-05-12 02:50:26

sql 怎么递归查询的方法:

1.创建测试表,createtabletest_connect(idnumber,p_idnumber);

② 如何实现数据库SQL递归查询在不同数据库中例子源代码

sql 递归查询的方法:
方法一:T-SQL递归查询
with Dep as
(
select Id,DeptCode,DeptName from Department where Id=1
union all
select d.Id,d.DeptCode,d.DeptName from Dep
inner join Department d on dep.Id = d.ParentDeptId
)
select * from Dep
方法二:PL/SQL递归查询
select Id,DeptCode,DeptName
from Department
start with Id = 1
connect by prior Id = ParentDeptId;

③ SQL中递归查询

CREATE PROCEDURE [dbo].[SetColGroup](@sColItemCode VARCHAR(50),@ReportID VARCHAR(50) )
AS
-- 获取ItemCode对应的GroupCode,并更新至临时表中
BEGIN

DECLARE @sSQL VARCHAR(1000)
DECLARE @colGroupCode VARCHAR(50)
DECLARE @SuperColItemCode VARCHAR(50)
DECLARE @colSuperGroupCode VARCHAR(50)

--获取下一级别的数据(这里的SuperColItemCode实际上是下一级数据)
DECLARE curGroupCodeTmp CURSOR LOCAL FOR
SELECT c.ColGroupCode,b.SuperColItemCode,d.ColGroupCode AS ColSuperGroupCode
FROM dbo.ReportItemCross b
INNER JOIN dbo.ReportColItem c ON b.ColItemCode = c.ColItemCode
INNER JOIN dbo.ReportColItem d ON b.SuperColItemCode = d.ColItemCode
WHERE b.ColItemCode = @sColItemCode AND b.ReportID = @ReportID
OPEN curGroupCodeTmp
FETCH NEXT FROM curGroupCodeTmp
INTO @colGroupCode,@SuperColItemCode,@colSuperGroupCode
WHILE @@FETCH_STATUS = 0
BEGIN
--此处进行实际数据处理
IF(ISNULL(@colGroupCode,'')<>'' AND ISNULL(@colSuperGroupCode,'')<>'')
SET @sSQL = 'update ##tmp set ' + @colSuperGroupCode + ' = ''' + @SuperColItemCode
+ ''' where ' + @colGroupCode + ' = ''' + @sColItemCode + ''''
EXECUTE(@sSQL)
--根据条件判断是否结束递归
IF(ISNULL(@SuperColItemCode,'') <> '')
EXEC SetColGroup @SuperColItemCode,@ReportID
FETCH NEXT FROM curGroupCodeTmp
INTO @colGroupCode,@SuperColItemCode,@colSuperGroupCode
END

CLOSE curGroupCodeTmp
DEALLOCATE curGroupCodeTmp

END

④ 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(''))

⑤ SQL递归查询知多少

sql 递归查询的方法:
方法一:T-SQL递归查询
with Dep as
(
select Id,DeptCode,DeptName from Department where Id=1
union all
select d.Id,d.DeptCode,d.DeptName from Dep
inner join Department d on dep.Id = d.ParentDeptId
)
select * from Dep
方法二:PL/SQL递归查询
select Id,DeptCode,DeptName
from Department
start with Id = 1
connect by prior Id = ParentDeptId;

⑥ 如何用一段SQL语句递归找到一个目录下的所有子目录

有一个存储目录树的表,定义目录间的关系字段有两个:
如下:(ClassID表示该目录的编号,ClassParentID表示它的父目录的编号)

ClassID ClassParentID
1 1
2 1
3 2
4 3
5 3

表示的关系应该是

-1--(根目录)
|
-2--(第二级目录)
|
-3--(第三级目录)
|
-4--(第四级目录)
|
-5--(第四级目录)

这样的目录关系.

那么我通过知道一个目录的ClassID,如何通过一条SQL语句找到所有该目录的子目录?

如:

"SELECT * FROM 表 WHERE ClassParentID = "+ClassID+"and ClassParentID <>"+ClassID

但只能找到第一层的子目录,如何找到所有子目录,请大家给一条SQL语句实现!!

(因为事先不知道目录有多少层,当然一定是一条带有while循环的SQL语句)

1、

create table Test2
(
ClassID int,
ClassParentID int,
)
go

create proc Test2_proc
@nClassParentID int -- 要查询的父节点ID 号
as
begin
set nocount on
--
declare @nClassID int,
@nIndex int
-- create TempTable
create table #ClassIDTemp
(
nIndex int identity(1,1),
ClassID int,
ClassParentID int,
nFlag int default(0),
)
create index #ClassIDTemp_Index on #ClassIDTemp(nIndex)

-- insert First RecordSet

insert into #ClassIDTemp(ClassID,ClassParentID) select
ClassID,ClassParentID from Test2 where ClassParentID =
@nClassParentID order by ClassParentID
-- Circle
while(0=0)
begin

select top 1 @nIndex = nIndex, @nClassID = ClassID
from #ClassIDTemp where nFlag = 0 order by nIndex
asc
if @@rowcount = 0
break
else
begin

insert into #ClassIDTemp(ClassID,ClassParentID) select
ClassID,ClassParentID from Test2 where ClassParentID =
@nClassID order by ClassParentID
end
update #ClassIDTemp set nFlag = 1 where nIndex = @nIndex
end

-- Select Result
select ClassID,ClassParentID from #ClassIDTemp order by nIndex
if exists(select * from sysobjects where name = '#ClassIDTemp')
drop table #ClassIDTemp
end
go

2、

declare @Table table ( ClassID int primary key , ClassParentID int)
declare @Test table ( ClassID int primary key , ClassParentID int)

insert into @Table values ( 1, 0 ) -- 建议这里是 1,0 而不是 1, 1
insert into @Table values ( 2, 1 )
insert into @Table values ( 3, 2 )
insert into @Table values ( 4, 3 )
insert into @Table values ( 5, 3 )

insert into @Test select * from @Table where ClassID = 2

while exists ( select * from @Table A
inner join @Test B
on A.ClassParentID = B.ClassID
where A.ClassID not in ( select ClassID from @Test ) )
begin
insert into @Test
select A.* from @Table A
inner join @Test B
on A.ClassParentID = B.ClassID
where A.ClassID not in ( select ClassID from @Test )
end

select * from @Test

3、

sql1 = "(SELECT ClassID FROM 表 WHERE ClassParentID =" + 变量 + ")"

sql2 = "(SELECT ClassID FROM 表 WHERE (ClassParentID IN
"+ sql1 + ") OR (ClassID IN " + sql1 + "))"

sql = "SELECT * FROM 表 WHERE ClassParentID IN " + sql2 + " OR ClassID IN " + sql2

这个办法可实现1到4级的所有情况(包括只有2级、3级的情况)

4、--我的方法是用自定义函数实现,这样具有通用性

--测试

--测试数据
create table 表(ClassID int,ClassParentID int)
insert 表 select 1,0
union all select 2,1
union all select 3,2
union all select 4,3
union all select 5,3
go

--自定义函数,返回指定目录下的所有子目录列表
create function f_child(@ClassID int)
returns @re table(ClassID int,Level int)
as
begin
declare @l int
set @l=0
insert @re select @ClassID,@l
while @@rowcount>0 --直接用@@rowcount判断
begin
set @l=@l+1
insert @re select a.ClassID,@l
from 表 a join @re b on a.ClassParentID=b.ClassID
where b.level=@l-1
end
return
end
go

--调用函数实现查询
select a.* from 表 a join dbo.f_child(1) b on a.ClassID=b.ClassID
go

--加上缩进效果
select ClassID=space(b.level*4)+cast(a.ClassID as varchar),a.ClassParentID
from 表 a join dbo.f_child(1) b on a.ClassID=b.ClassID

go
--删除测试环境
drop table 表
drop function f_child

/*--测试结果
ClassID ClassParentID
----------- -------------
1 0
2 1
3 2
4 3
5 3

(所影响的行数为 5 行)

ClassID ClassParentID
-------------- ----------------
10
2 1
3 2
4 3
5 3

(所影响的行数为 5 行)
--*/

⑦ 如何用SQL递归查询出下面的结果 SQL递归语法是怎么查询的

create table #A (a int,b int)
insert #a select 1 , 1000
insert #a select 2 , 2000
insert #a select 3 , 3000
insert #a select 4 , 4000

-------------------------------------------
create table #b(a int,b int)
insert into #bselect * from #a where a=1
declare @a int
declare @b int
select @a=min(a) from #a
select @b=max(a) from #A
while (@a<=@b)
begin

insert into #b
select t1.a,t1.b+t2.b
from #a t1,#b t2
where t1.a=t2.a+1
and t2.a=@a

set @a=@a+1
end
select * from #b

⑧ sql语句中怎么实现递归查询

在SQL
SERVER
2000
中你可以先一些自定义函数,或一些存储过程,实现递归:
select
level,TypeName
from
ProctType
t
START
WITH
t.ParentID=0
CONNECT
BY
PRIOR
t.ProctTypeID=
t.ParentID;

⑨ 递归SQL语句


CREATETABLE#test(
Achar(1),
Bchar(1)
)
GO

INSERTINTO#testVALUES('a','b');
INSERTINTO#testVALUES('b','c');
INSERTINTO#testVALUES('c','d');
INSERTINTO#testVALUES('d','e');
INSERTINTO#testVALUES('e','f');
INSERTINTO#testVALUES('a','g');
INSERTINTO#testVALUES('a','h');
INSERTINTO#testVALUES('g','m');
INSERTINTO#testVALUES('m','n');
GO


WithmyCTEAS
(
SELECT
0ASLevel,A,B
FROM
#test
WHERE
B='e'
UNIONALL
SELECT
myCTE.Level+1ASLevel,
t.A,t.B
FROM
#testtJOINmyCTEON(myCTE.A=t.B)
)
SELECTtop1
AAS[最高父节点]
FROM
myCTE
ORDERBY
LevelDESC
GO

最高父节点
-----
a

(1行受影响)

WithmyCTEAS
(
SELECT
0ASLevel,A,B
FROM
#test
WHERE
B='e'
UNIONALL
SELECT
myCTE.Level+1ASLevel,
t.A,t.B
FROM
#testtJOINmyCTEON(myCTE.B=t.A)
)
SELECTtop1
BAS[最下面子节点]
FROM
myCTE
ORDERBY
LevelDESC
GO


最下面子节点
------
f

(1行受影响)



SQL Server 2008 Express 版本下测试通过。

⑩ 如何实现SQL语句的递归查询

1.创建测试表,createtabletest_connect(idnumber,p_idnumber);

热点内容
sim卡的密码怎么设置密码 发布:2025-05-10 23:41:09 浏览:715
自定义缓存注解 发布:2025-05-10 23:40:06 浏览:117
sqltext类型长度 发布:2025-05-10 23:30:21 浏览:979
图形AI算法 发布:2025-05-10 23:30:19 浏览:182
java上传的文件在哪里 发布:2025-05-10 23:30:06 浏览:159
议长访问台湾 发布:2025-05-10 23:22:46 浏览:433
启动电机如何配置开关 发布:2025-05-10 23:21:21 浏览:960
三维数组存储 发布:2025-05-10 23:14:35 浏览:981
普通电脑架设成云服务器 发布:2025-05-10 23:13:56 浏览:808
为什么找回密码总是说验证码 发布:2025-05-10 23:04:07 浏览:183