cte1是无效的对象名称

时间:2019-01-16 09:26:45

标签: sql-server tsql

问题是

  

已下达最大订单数的客户是否有   最高评分?

带有表格订单,客户和销售人员

我尝试使用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被标识为无效对象

2 个答案:

答案 0 :(得分:0)

CTE的局限性是CTE的范围仅到CTE声明后的下一行为止。因此,此后您将无法使用CTE。

在您的情况下,这意味着当您根据MAX(cnt)检查cnt时,CTE1在行中终止了它的作用域,因此无法进一步引用。

有2个解决方案。

第一个是使用Temp表或Table变量而不是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

答案 1 :(得分:0)

创建一个cte只能立即使用。然后,您无法在执行额外的选择查询并创建cte2之后使用cte1

如果要使用两个ctes进行选择查询,则需要此查询

;with cte1 as (
    select count(onum) cnt,cnum
    from sql_practice.practice.Orders o 
    group by cnum)
,cte2 as
    (select cnum from sql_practice.practice.Customer where rating in(select max(RATING) 
    from sql_practice.practice.Customer))

select * from cte2
inner join cte1 on cte2.CNUM=cte1.cnum;