2012-02-03 136 views
2

我有(来自imdb数据库)casts表和movie表。我试图找到最大的演员(不同的演员)的电影名称和演员的大小。SQL Server'无效列名'错误

这是我想出了,但我得到的 “TOTALCOUNT”

为什么一个

“无效列名” 的错误?

此外,此查询是否正确?

select name, count(distinct pid) as totalcount 
from casts join movie on mid=movie.id 
where totalcount = 
    (select max(CastCount.total) 
    from (select count(distinct pid) as total from casts group by mid)CastCount) 
group by name; 
+0

是MySQL还是SQL Server问题?请为您的问题使用正确的标签。 – Mchl 2012-02-03 22:08:44

+0

我的印象是,mssql服务器使用mysql。没有? – Colleen 2012-02-03 22:12:08

+0

编号MSSQL服务器是另一种与MySQL几乎没有共同之处的产品(除了事实,它们都是SQL关系数据库管理系统) – Mchl 2012-02-03 22:13:10

回答

1

您不能在WHERE中使用别名。由于它是聚合的,因此您应该用HAVING替换它: HAVING totalcount = ... 此外,您的子查询可能会返回多于一行,并且您将有另一个错误。

+0

谢谢!为什么我会有一个错误,如果我的子查询返回多行? – Colleen 2012-02-03 22:13:11

+0

现在我有:\t选择名称,计数(不同的PID) \t从铸件按名称 具有计数\t(不同PID)=上月中旬= movie.id \t组参加电影 \t \t(选择最大(CastCount.total ) \t \t from(select count(distinct pid)from casts group by mid)CastCount); 但它返回0行。你对此有何认识? – Colleen 2012-02-03 22:13:41

+2

@Colleen:你正在比较'totalcount'和子查询的结果。如果后者返回多于一行,'='没有意义,并且您将需要使用'IN(或ANY,SOME)'取决于您的要求。 – a1ex07 2012-02-03 22:16:15

1

在MySQL中,您无法通过其别名在WHERE子句中引用别名列。

最好的办法是不要选择计数等于选定的最大值。相反,按从高到低的顺序排列,并限制到第一行。

+0

保持简单。 +1 – Mchl 2012-02-03 22:14:26

+0

我不应该认为只有一个。 – Colleen 2012-02-03 22:15:27

0

像这样的东西?

SELECT movie.name, COUNT(casts.id) AS castsize 
FROM cast 
JOIN movie 
ON movie.id = casts.mid 
GROUP BY casts.mid 
HAVING COUNT(casts.id) = MAX(COUNT(casts.id)) 
+0

我不需要在最大数量上由电影ID组成的群组,我不能不这样做,所以我不需要一个子选择? – Colleen 2012-02-03 22:22:24

+0

@Colleen,已经有一个“GROUP BY”,它将用于所有聚合函数。但是,你说得对,我需要把'WHERE'改成'HAVING',它应该可以工作。 – 2012-02-03 22:25:58