CTE能否被多次用?

蔡袅 2014-03-27 03:21:10
 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不能这么做呢?
...全文
292 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
LongRui888 2014-03-27
  • 打赏
  • 举报
回复

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 ..就会报错
LongRui888 2014-03-27
  • 打赏
  • 举报
回复
引用 7 楼 xx_mm 的回复:
[quote=引用 6 楼 fredrickhu 的回复:]
CTE只对当前批有用 
也就是说只能调用一次

;with f as 
(
select  * from tb 
)

select * from f
--
如果再select * from f as a inner join b on ..就会报错
恩恩,就是这个。可是有啥替代方案不? [/quote] 这个肯定会报错的,因为这个是cte的基本使用方法。 如果你以后还要调用,额可以考虑吧数据插入到临时表中,然后调用临时表,就可以了
KevinLiu 2014-03-27
  • 打赏
  • 举报
回复
use temp table or table variable
--小F-- 2014-03-27
  • 打赏
  • 举报
回复
引用 7 楼 xx_mm 的回复:
[quote=引用 6 楼 fredrickhu 的回复:]
CTE只对当前批有用 
也就是说只能调用一次

;with f as 
(
select  * from tb 
)

select * from f
--
如果再select * from f as a inner join b on ..就会报错
恩恩,就是这个。可是有啥替代方案不? [/quote] 临时表。
發糞塗牆 2014-03-27
  • 打赏
  • 举报
回复
引用 7 楼 xx_mm 的回复:
[quote=引用 6 楼 fredrickhu 的回复:]
CTE只对当前批有用 
也就是说只能调用一次

;with f as 
(
select  * from tb 
)

select * from f
--
如果再select * from f as a inner join b on ..就会报错
恩恩,就是这个。可是有啥替代方案不? [/quote]换表变量或者临时表
叶子 2014-03-27
  • 打赏
  • 举报
回复
定义后,只能使用一次。
蔡袅 2014-03-27
  • 打赏
  • 举报
回复
引用 6 楼 fredrickhu 的回复:
CTE只对当前批有用 
也就是说只能调用一次

;with f as 
(
select  * from tb 
)

select * from f
--
如果再select * from f as a inner join b on ..就会报错
恩恩,就是这个。可是有啥替代方案不? 
--小F-- 2014-03-27
  • 打赏
  • 举报
回复
CTE只对当前批有用 
也就是说只能调用一次

;with f as 
(
select  * from tb 
)

select * from f
--
如果再select * from f as a inner join b on ..就会报错
發糞塗牆 2014-03-27
  • 打赏
  • 举报
回复
直观一点:
;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
*/
xxfvba 2014-03-27
  • 打赏
  • 举报
回复
应该可以啊,,
發糞塗牆 2014-03-27
  • 打赏
  • 举报
回复
实践证明:可以
;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


*/
蔡袅 2014-03-27
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
你可以两次cte,比如: ;with cte as (......),cte1 as (select * from cte where xxx) select * from cte1 where xxxx
 我没做测试,那最后的那个select 还可以使用上面的cte不
發糞塗牆 2014-03-27
  • 打赏
  • 举报
回复
你可以两次cte,比如: ;with cte as (......),cte1 as (select * from cte where xxx) select * from cte1 where xxxx

22,298

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧