为 CTE 中的变量赋值



我想在 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

最新更新