当前位置: 代码迷 >> Sql Server >> CTE可否被多次用
  详细解决方案

CTE可否被多次用

热度:84   发布时间:2016-04-24 18:17:28.0
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 ..就会报错

恩恩,就是这个。可是有啥替代方案不? 

临时表。
------解决方案--------------------
use temp table or table variable

------解决方案--------------------
引用:
Quote: 引用:

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

;with f as 
(
select  * from tb 
)

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

恩恩,就是这个。可是有啥替代方案不? 


这个肯定会报错的,因为这个是cte的基本使用方法。

如果你以后还要调用,额可以考虑吧数据插入到临时表中,然后调用临时表,就可以了
------解决方案--------------------

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

if object_id('tempdb..#temp') is not null
  drop table #temp

;with f as 
(
select  * from tb 
)

select * into #temp from f
--
如果再select * from #temp as a inner join b on ..就会报错
  相关解决方案