为CTE中的一个变量赋值。

问题描述 投票:0回答:3

我想在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 sql-server tsql sql-server-2017
3个回答
1
投票

在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
;

1
投票

这在SQL Server中是明确不允许的。 一个查询要么返回一个结果集,要么(专门)分配变量,但不能同时使用这两种方式。

我不知道为什么你会在这个例子中使用CTE或变量。 一个简单的子查询似乎很简单。

Select t2.*
from MyTbl2 t2
where t2.qty = (select count(*) from mytable t);

SQL Server中的CTE并没有提供性能上的优势。 而且我也没有看到在这个例子中使用它们有什么 "代码清晰度 "的好处。


0
投票

不,不可能在cte查询定义里面填充变量。

cte查询定义必须返回一个结果集,而在T-SQL中不可能做到这两点--一个 select 语句既可以返回结果集,也可以填充变量--但不能同时进行。

因此,不可能在一个普通的表表达式查询里面填充变量。


0
投票

你可以使用 SUBQUERY 而不是使用 Recursive CTE

SELECT * FROM MYTBL2 M
INNER JOIN(
SELECT COUNT(ID) AS MYQTY FROM MYTBL) S ON M.QTY=S.MYQTY
© www.soinside.com 2019 - 2024. All rights reserved.