sql-server - 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 被识别为无效对象
解决方案
CTE 的限制是一个 Cte 的范围只能到 CTE 声明之后的下一行。所以在那之后你不能使用CTE。
这意味着在您的情况下,当您根据 MAX(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
推荐阅读
- php - 如何在 laravel 中创建 30 天倒计时
- c++ - 如何为全局命名空间中的类提供 swap()?
- javascript - Determine next map by mapsOrder array
- python - PostgreSQL- ModuleNotFoundError:没有名为“psycopg2”的模块
- c# - 为 Serilog 创建一个包装器
- google-api - 如何在不询问用户身份验证的情况下授权我的应用程序并自动访问我的电子邮件帐户?
- r - 如何在R中导入和合并多个excel文件?
- regex - 如何使用 RegEx 排除符号/字符?
- c - 如何制作修改结构的函数
- python - 是否有另一种方法可以将信息存储在允许列表的键:值关系中?(即不是字典)