我想在CTE中给我的变量赋值,然后在下一个CTE中使用。
这可能吗?
declare @TypeQty as int
;
With CTE1 as
(@TypeQty = (select Count(ID) as MyQty from MyTbl))
,CTE2 as
(select * from MyTbl2 where Qty= @TypeQty)
Select * from CTE2
我知道用其他方法可以实现,但我想知道用CTE是否可以?
在SQL Server中,你不能使用你在问题中写的这种语法。
你可以在没有变量的情况下使用计算值,只是通过引用CTE本身。像这样。
WITH
CTE1
as
(
select Count(ID) as MyQty
from MyTbl
)
,CTE2
as
(
select *
from
MyTbl2
INNER JOIN CTE1 ON MyTbl2.Qty = CTE1.MyQty
)
Select *
from CTE2
;
这在SQL Server中是明确不允许的。 一个查询要么返回一个结果集,要么(专门)分配变量,但不能同时使用这两种方式。
我不知道为什么你会在这个例子中使用CTE或变量。 一个简单的子查询似乎很简单。
Select t2.*
from MyTbl2 t2
where t2.qty = (select count(*) from mytable t);
SQL Server中的CTE并没有提供性能上的优势。 而且我也没有看到在这个例子中使用它们有什么 "代码清晰度 "的好处。
不,不可能在cte查询定义里面填充变量。
cte查询定义必须返回一个结果集,而在T-SQL中不可能做到这两点--一个 select
语句既可以返回结果集,也可以填充变量--但不能同时进行。
因此,不可能在一个普通的表表达式查询里面填充变量。
你可以使用 SUBQUERY
而不是使用 Recursive CTE
SELECT * FROM MYTBL2 M
INNER JOIN(
SELECT COUNT(ID) AS MYQTY FROM MYTBL) S ON M.QTY=S.MYQTY