D1 as (
Select * from TB
),D2 as (
Select * from TB1 where not exists (select 1 from TB1 where datediff(minutes,time,a.time)<2)
Union all
Select a.*,b.* from D1 a inner join D2 b where …)
Select * from TB1 where not exists (select 1 from TB1 where datediff(minutes,time,a.time)<2)
我想问的是 time 和 a.time的值传递问题,这语句的意思是外查询一条条传递给内查询,不符合时间差为2的输出,究竟这时间值是怎么读的?字段time时间是递增的,表都是一样的,怎么好像a.time总比time读快一行…
还有
Select a.*,b.* from D1 a inner join D2 b where …
此时D2怎么有值了
------解决思路----------------------
首先,你没有给表结构,就开始怎么怎么了~~
另外,可以看出D2是递归的句式,不过,你确定这样子写递归得了?
Select * from TB1
Select a.*,b.* from D1 a inner join D2 b
这两个的列数明显不一样,编译都通不过
最后,递归方式的公用表表达式,SQLSERVE应该是特殊处理了,用于递归时,在UNION ALL后面可以对自己进行引用
但只有新的值会进去下一次递归
------解决思路----------------------
学习怎么写 with as ,可以看下这个贴子...
http://hi.baidu.com/kocokolo/item/8040c9fe51fc8cef1a111f76
我以前才学写 with as 时就是参考这个的
------解决思路----------------------
递归的逻辑可以这样理解:
1)把根放入队列。
2)取队列第一个节点,如果它有子节点,把子节点加入队列。
3)循环2一直到队列为空。
D2中 UNION ALL 前面的 SELECT 就是步骤1,UNION ALL 后面 SELECT 就是步骤2。
关键不是整个D2只执行一次后面的 SELECT,而是D2中的每条记录都要执行一次。