在论坛中出现的比较难的sql问题:8(递归问题1)
2013-11-05 11:09
519 查看
最近,在论坛中,遇到了不少比较难的sql问题,虽然自己都能解决,但发现过几天后,就记不起来了,也忘记解决的方法了。 所以,觉得有必要记录下来,这样以后再次碰到这类问题,也能从中获取解答的思路。 1、sql2008 树形结构分组 http://bbs.csdn.net/topics/390634930 ID DeprtID DeprtName
1 0 1
2 1 2
3 1 3
4 2 4
5 3 5
6 4 6
7 5 7
分组后效果
ID DeprtID DeprtName
1 0 1
2 1 2
4 2 4
6 4 6
3 1 3
5 3 5
7 5 7
我的解法:
2、MS-SQL取连续日期问题 http://bbs.csdn.net/topics/390635235?page=1#post-395995697
![](http://img.blog.csdn.net/20131106184402937?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvc3Fsc2VydmVyZGlzY292ZXJ5/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
我现在需要得出表A中所有FBeginDate和FEndDate字段间的日期
下面是我的解法,使用了递归查询:
3、求一个获取连续值的方法。 http://bbs.csdn.net/topics/390620211
这个用spt_values也可以。 如果是SQL Server 2005及以后的版本,可以通过递归来实现,非常简单。
我的解法:
本文出自 “探索SQLServer” 博客,请务必保留此出处http://yupeigu.blog.51cto.com/3323001/1368060
1 0 1
2 1 2
3 1 3
4 2 4
5 3 5
6 4 6
7 5 7
分组后效果
ID DeprtID DeprtName
1 0 1
2 1 2
4 2 4
6 4 6
3 1 3
5 3 5
7 5 7
我的解法:
--drop table tb create table tb(ID int, DeprtID int, DeprtName varchar(10)) insert into tb select 1, 0, '1' union all select 2 , 1 , '2' union all select 3 , 1 , '3' union all select 4 , 2 , '4' union all select 5 , 3 , '5' union all select 6 , 4 , '6' union all select 7 , 5, '7' go ;with t as ( select id,DeprtID,DeprtName,1 as level, cast(right('000'+cast(id as varchar),3) as varchar(max)) as sort from tb where DeprtID =0 union all select tb.id,tb.DeprtID,tb.DeprtName,level + 1 , cast(sort+right('000'+cast(tb.id as varchar),3) as varchar(max)) from t inner join tb on t.id = tb.DeprtID ) select id,deprtid,deprtname from t order by sort /* id deprtid deprtname 1 0 1 2 1 2 4 2 4 6 4 6 3 1 3 5 3 5 7 5 7 */这里还有个例子,就是递归查询后,按照树形来排序:
drop table tb create table tb ( id int, pid int, name varchar(20) ) insert into tb select 1,null,'x' union all select 2,1,'a' union all select 3,1,'b' union all select 4,2,'aa' union all select 5,3,'bb' go ;with t as ( select id,pid,name,1 as level, cast(right('000'+cast(id as varchar),3) as varchar(max)) as sort from tb where pid is null union all select tb.id,tb.pid,tb.name,level + 1 , cast(sort+right('000'+cast(tb.id as varchar),3) as varchar(max)) from t inner join tb on t.id = tb.pid ) select * from t order by sort /* id pid name level sort 1 NULL x 1 001 2 1 a 2 001002 4 2 aa 3 001002004 3 1 b 2 001003 5 3 bb 3 001003005 */
2、MS-SQL取连续日期问题 http://bbs.csdn.net/topics/390635235?page=1#post-395995697
我现在需要得出表A中所有FBeginDate和FEndDate字段间的日期
下面是我的解法,使用了递归查询:
drop table tb create table tb(FBeginDate datetime,FEndDate datetime) insert into tb select '2010-10-01','2010-10-01' union all select '2010-10-01','2010-10-07' union all select '2011-01-30','2011-02-12' ;with t as ( select 1 as number union all select number + 1 from t where t.number < 100 ) select tb.FBeginDate, tb.FEndDate, dateadd(day,t.number-1,FBeginDate) as '两个日期之间的天' from tb inner join t on datediff(day,FBeginDate,FEndDate) +1 >= t.number order by tb.FBeginDate, '两个日期之间的天' /* FBeginDate FEndDate 两个日期之间的天 2010-10-01 00:00:00.000 2010-10-01 00:00:00.000 2010-10-01 00:00:00.000 2010-10-01 00:00:00.000 2010-10-07 00:00:00.000 2010-10-01 00:00:00.000 2010-10-01 00:00:00.000 2010-10-07 00:00:00.000 2010-10-02 00:00:00.000 2010-10-01 00:00:00.000 2010-10-07 00:00:00.000 2010-10-03 00:00:00.000 2010-10-01 00:00:00.000 2010-10-07 00:00:00.000 2010-10-04 00:00:00.000 2010-10-01 00:00:00.000 2010-10-07 00:00:00.000 2010-10-05 00:00:00.000 2010-10-01 00:00:00.000 2010-10-07 00:00:00.000 2010-10-06 00:00:00.000 2010-10-01 00:00:00.000 2010-10-07 00:00:00.000 2010-10-07 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-01-30 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-01-31 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-02-01 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-02-02 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-02-03 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-02-04 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-02-05 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-02-06 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-02-07 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-02-08 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-02-09 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-02-10 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-02-11 00:00:00.000 2011-01-30 00:00:00.000 2011-02-12 00:00:00.000 2011-02-12 00:00:00.000 */
3、求一个获取连续值的方法。 http://bbs.csdn.net/topics/390620211
这个用spt_values也可以。 如果是SQL Server 2005及以后的版本,可以通过递归来实现,非常简单。
我的解法:
;with r as ( select 1 as number --第一个数 union all select number + 1 from r where r.number < 10 --最后一个数 ) select * from r --option(maxrecursion 1000) /* number 1 2 3 4 5 6 7 8 9 10 */
本文出自 “探索SQLServer” 博客,请务必保留此出处http://yupeigu.blog.51cto.com/3323001/1368060
相关文章推荐
- 在论坛中出现的比较难的sql问题:21(递归问题3)
- 在论坛中出现的比较难的sql问题:28(循环查询表来实现递归)
- 在论坛中出现的比较难的sql问题:21(递归问题 检索某个节点下所有叶子节点)
- 在论坛中出现的比较难的sql问题:8(递归问题 树形结构分组)
- 在论坛中出现的比较难的sql问题:33(递归 连续日期问题 )
- 在论坛中出现的比较难的sql问题:12(递归问题2)
- 在论坛中出现的比较难的sql问题:12(递归问题2 拆分字符串)
- 在论坛中出现的比较难的sql问题:34(递归 获取连续值问题)
- 在论坛中出现的比较难的sql问题:20(触发器专题2)
- 在论坛中出现的比较难的sql问题:30(row_number函数 物料组合问题)
- 在论坛中出现的比较难的sql问题:44(触发器专题 明细表插入数据时调用主表对应的数据)
- 在论坛中出现的比较难的sql问题:2(row_number函数+子查询)
- 在论坛中出现的比较难的sql问题:20(触发器专题2)
- 在论坛中出现的比较难的sql问题:41(循环替换 循环替换关键字)
- 在论坛中出现的比较难的sql问题:2(row_number函数+子查询)
- 在论坛中出现的比较难的sql问题:7(子查询)
- 在论坛中出现的比较难的sql问题:35(时间间隔计算问题)
- 在论坛中出现的比较难的sql问题:15(行转列2)
- 在论坛中出现的比较难的sql问题:4(row_number函数+子查询2)
- 在论坛中出现的比较难的sql问题:7(子查询 判断某个字段的值是否连续)