sql—为cte中的变量赋值

yc0p9oo0  于 2021-07-26  发布在  Java
关注(0)|答案(4)|浏览(704)

我想给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是否可能?

r8uurelv

r8uurelv1#

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

j13ufse22#

这在sql server中是明确不允许的。查询要么返回结果集,要么(以独占方式)指定变量,但不能同时指定两者。
我确实想知道为什么您会在这个示例中使用CTE或变量。一个简单的子查询似乎足够简单:

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

sql server中的CTE不提供性能优势。在这种情况下,我看不出使用它们有什么“代码清晰”的好处。

ssm49v7z

ssm49v7z3#

不,不可能在cte查询定义中填充变量。
cte查询定义必须返回一个结果集,在t-sql-a中不可能同时返回这两个结果集 select 语句可以返回结果集或填充变量,但不能同时返回结果集和填充变量。
因此,不可能在公共表表达式查询中填充变量。

qvtsj1bj

qvtsj1bj4#

你可以用 SUBQUERY 而不是使用 Recursive CTE ```
SELECT * FROM MYTBL2 M
INNER JOIN(
SELECT COUNT(ID) AS MYQTY FROM MYTBL) S ON M.QTY=S.MYQTY

相关问题