给表取别名后对象名无效?

bst*_*ife 8 sql-server t-sql

当我运行以下查询时

select distinct A.movieID, A.avgStars from 
(select mID as movieID, avg(stars) as avgStars
from Rating
group by mID) A
where  A.avgStars <= all(select A.avgStars from A);
Run Code Online (Sandbox Code Playgroud)

我收到错误“无效的对象名称‘A’。”

你知道我为什么会得到这个吗?

谢谢!

Aar*_*and 10

您不能在同一范围内从子查询中引用别名。不过,您可以使用 CTE 来做到这一点;也许你的意思是:

;WITH Avgs AS
(
  select mID as movieID, avg(stars) as avgStars
  from Rating group by mID
)
SELECT movieID, avgStars FROM Avgs
WHERE avgStars <= ALL (SELECT AvgStars FROM Avgs);
Run Code Online (Sandbox Code Playgroud)

你也不应该需要DISTINCT那里。


ype*_*eᵀᴹ 7

其他答案已经确定了问题以及如何解决它。

这是另一种进一步简化查询的方法:

select top (1) with ties
    mID as movieID, avg(stars) as avgStars
from Rating 
group by mID
order by avgStars ;
Run Code Online (Sandbox Code Playgroud)

根据您尝试申请的条件:

A.avgStars <= all(select A.avgStars from A)
Run Code Online (Sandbox Code Playgroud)

您的查询应该只返回平均值最低的条目。相同的逻辑可以用top (1) with ties+以更简单的方式表达order by,如上所示。


Sql*_*Zim 5

您正在尝试from在新子查询中引用语句中的别名。

不过,您可以使用公共表表达式执行类似的操作。

;with a as (
select mID as movieID, avg(stars) as avgStars
  from Rating
  group by mID
)

select distinct A.movieID, A.avgStars 
from a
where  A.avgStars <= all(select A.avgStars from A);
Run Code Online (Sandbox Code Playgroud)