数据库语句的递归查询求助

数据库语句的递归查询求助,第1张

应该是这样:

with qry as (select user_id,parent_id from tab where user_id = 32
union all
select tabuser_id,tabparent_id from tab,qry
where tabparent_id = qryid)
select from qry ;

我用mysql5022,不支持上述语法,oracle就可以(sqlserver应该也可以):
create table tab1(user_id int, parent_id int);
insert into tab1 values(1,null);
insert into tab1 values(32,1);
insert into tab1 values(101,32);
insert into tab1 values(102,32);
insert into tab1 values(201,101);
insert into tab1 values(202,101);
insert into tab1 values(203,102);
insert into tab1 values(204,102);
select from tab1;
with qry(user_id,parent_id) as (select user_id,parent_id from tab1 where user_id = 32
union all
select tab1user_id,tab1parent_id from tab1,qry
where tab1parent_id = qryuser_id
)
select from qry;

所以,mysql没有办法了,只有写函数,用循环来实现了。

SQL 数据库 实现递归查询的几种代码方法 表结构

ProductCategory

CategoryID Level ParentCategoryID

数据

T SQL

WITH CategoryTemp(CategoryID ParentCategoryID) 临时表用来保存查到的Category

(

SELECT CategoryID ParentCategoryID FROM ProductCategory WHERE ParentCategoryID<= 将所有的第一层查出来作为初始数据 需要查第几层或者哪个ParentCategoryID下面所有的 N层 把ParentCategoryID赋相关的值即可

UNION ALL 查询N层

SELECT pc CategoryID ParentCategoryID FROM ProductCategory pc

LEFT JOIN CategoryTemp ct ON pc ParentCategoryID=ct CategoryID

WHERE ParentCategoryID> 因为第一层前面已经查出来了 所以这里把第一层筛选掉

)

SELECT CategoryID ParentCategoryID FROM CategoryTemp

结果

如果把ParentCategoryID赋为 结果则为

实例

ID 是否为部门   部门名   上级ID        y                       部门             y                       部门             n                       张三              n                       李二              y                       部门             n                       王五              y                       部门3       n                       小三         我想找询   ID   值为      下级的所有人员包括下级部门的所有人员

创建查询函数 create   function   f_id( @id   int 要查询的id )returns   @re   table(id   int level   int) as begin declare   @l   int set   @l= insert   @re   select   id @l from   表   where   上级id=@id while   @@rowcount> begin set   @l=@l+ insert   @re   select   a id @l from   表   a   join   @re   b   on   a 上级id=b id   and   b level=@l end return end go

调用函数进行查询 select   a    from   表   a   join   f_id( )   b   on   a id=b id

联合查询

测试数据 create   table   表(ID   int 是否为部门   char( ) 部门名   varchar( ) 上级ID   int) insert   表   select      y 部门    union   all   select   y 部门    union   all   select   n 张三    union   all   select   n 李二    union   all   select   y 部门 union   all   select   n 王五    union   all   select   y 部门 union   all   select   n 小三    go

创建查询函数 create   function   f_id( @id   int 要查询的id )returns   @re   table(id   int level   int) as begin declare   @l   int set   @l= insert   @re   select   id @l from   表   where   上级id=@id while   @@rowcount> begin set   @l=@l+ insert   @re   select   a id @l from   表   a   join   @re   b   on   a 上级id=b id   and   b level=@l end return end go

调用函数进行查询 select   a    from   表   a   join   f_id( )   b   on   a id=b id go

删除测试 drop   table   表 drop   function   f_id

/ 测试结果

ID                     是否为部门   部门名                 上级ID                                                  n           小三                  

lishixinzhi/Article/program/MySQL/201311/29557

SELECT COUNT() FROM tablename WHERE (username = 'Jack') and
(DATE_ADD(sign_date, INTERVAL 1 DAY) IN
(SELECT sign_date FROM tablename WHERE (username = 'Jack'))
)
这里么有考虑5号星期五签到8号星期一签到也是连续签到的情况,抛砖引玉,你已经可以完成了。
你可以需要用到的函数:DAYOFWEEK

我给你举个递归查询嵌套的例子,你看一下就明白了。
select yr_student_infoname from yr_student_info where yr_student_infoschool_id in (select yr_school_infoid from yr_school_info where yr_school_infoprovince='上海' and yr_school_infocity='上海')


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/13400128.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-07-29
下一篇 2023-07-29

发表评论

登录后才能评论

评论列表(0条)

保存