日期:2014-05-16  浏览次数:20576 次

CTE能否被多次用?
 WITH T1 AS(
  SELECT * FROM dbo.T_AC_Questions A WHERE A.QV_ID=@QVID AND A.SS_CODE='ON' AND A.QT_ID NOT IN(
  SELECT QT_ID FROM @Questions)


我想在这之后多次用到,比如查询返回了多少行,进行一系列判断之后符合将整个表插入到另一个表,不符合就执行其他的

可是CTE不能这么做呢?

------解决方案--------------------
你可以两次cte,比如:
;with cte as
(......),cte1 as (select * from cte where xxx)
select * 
from cte1 where xxxx
------解决方案--------------------
实践证明:可以
;WITH cte AS (SELECT 1 id UNION ALL SELECT 2),
cte2 AS 
(
SELECT * FROM cte 
)
SELECT a.id AS AID,B.ID AS BID FROM cte a inner join cte2 b ON a.id=b.id

/*
AID         BID
----------- -----------
1           1
2           2


*/

------解决方案--------------------
应该可以啊,,
------解决方案--------------------
直观一点:
;WITH cte AS (SELECT 1 id UNION ALL SELECT 2),
cte2 AS 
(
SELECT * FROM cte 
)
SELECT *,'FirstCTE' FROM cte2
UNION ALL 
SELECT *,'SecondCTE' FROM cte
/*
id          
----------- ---------
1           FirstCTE
2           FirstCTE
1           SecondCTE
2           SecondCTE
*/

------解决方案--------------------
CTE只对当前批有用 
也就是说只能调用一次

;with f as 
(
select  * from tb 
)

select * from f
--
如果再select * from f as a inner join b on ..就会报错

------解决方案--------------------
定义后,只能使用一次。
------解决方案--------------------
引用:
Quote: 引用:

CTE只对当前批有用 
也就是说只能调用一次

;with f as 
(
select  * from tb 
)

select * from f
--
如果再select * from f as a inner join b on ..就会报错

恩恩,就是这个。可是有啥替代方案不? 
换表变量或者临时表
------解决方案--------------------
引用:
Quote: 引用:

CTE只对当前批有用 
也就是说只能调用一次

;with f as 
(
select  * from tb 
)

select * from f
--
如果再select * from f as a inner join b on ..就会报错