首页 > 解决方案 > cte1 是无效的对象名称

问题描述

问题是

下单数量最多的客户的评分是否最高?

与表订单、客户和销售人员

我尝试使用 CTE 解决它,但它给了我错误。我写的代码是

;with cte1 as (
select count(onum) cnt,cnum
from sql_practice.practice.Orders o 
group by cnum)

select * from cte1 where cnt=(
select max(cnt) from (select count(onum) cnt,cnum
from sql_practice.practice.Orders o 
group by cnum)A)

;with cte2 as(select cnum from sql_practice.practice.Customer where rating in(select max(RATING) from 
sql_practice.practice.Customer))

select * from cte2,cte1 where cte2.CNUM=cte1.cnum;

在上述查询中,cte1 被识别为无效对象

标签: sql-servertsql

解决方案


CTE 的限制是一个 Cte 的范围只能到 CTE 声明之后的下一行。所以在那之后你不能使用CTE。

这意味着在您的情况下,当您根据 MA​​X(cnt) 检查 cnt 时,CTE1 结束了它的范围,因此无法进一步引用它。

有2个解决方案。

第一个是使用临时表或表变量而不是 CTE。

但看看你的要求。我认为以下方法将更好地解决您的问题

;WITH CTE
AS
(
    SELECT
        C.cnum,
        MaxOnum = MAX(O.Onum) OVER(PARTITION BY NULL),
        MaxRating = MAX(C.Rating) OVER(PARTITION BY NULL)
        FROM sql_practice.practice.Orders O
            INNER JOIN sql_practice.practice.Customer C
                ON C.CNUM = O.Cnum
)
SELECT
    *
    WHERE MaxOnum = MaxRating

推荐阅读