为什么此查询中存在无效标识符?

时间:2014-09-22 00:03:36

标签: sql oracle11g

我想将count的结果赋给变量,所以我稍后可以在查询中使用它,这是我的代码:

select distinct(Artist), count(distinct(Instrument)) as allins 
from performers 
where allins = (select count(distinct(x.Instrument)) 
                from performers x) 
group by Artist;

错误:ORA-00904: "ALLINS": invalid identifier

3 个答案:

答案 0 :(得分:2)

这是您的查询:

select distinct(Artist), count(distinct(Instrument)) as allins 
from performers
where allins = (select count(distinct(x.Instrument)) from performers x)
group by Artist;
淘气,顽皮。您不能在select子句中使用where中定义的列别名。您也不能在where子句中使用聚合函数,因此代码没有意义。你想要的是having条款:

select Artist, count(distinct(Instrument)) as allins 
from performers
group by Artist
having count(distinct Instrument) = (select count(distinct x.Instrument) from performers x)

注意:当您有聚合查询时,几乎不需要select distinct。并且,distinct不是函数,因此不需要括号。

答案 1 :(得分:0)

标准SQL不允许在WHERE子句中引用列别名。

强制执行此限制是因为在评估WHERE子句时,可能尚未确定列值。 Column_alias可以在ORDER BY子句中使用,但不能在WHERE,GROUP BY或HAVING子句中使用。

文档参考:

http://dev.mysql.com/doc/refman/5.5/en/problems-with-alias.html

http://msdn.microsoft.com/en-us/library/ms173451.aspx

答案 2 :(得分:0)

SQL的执行绝对不同于Java或C,因此通常会让新程序员加入该语言。

通常,数据库理解SQL指令的顺序如下:

FROM - >在哪里 - > GROUP BY - > ... - > SELECT

为了正确地执行此操作,您无法声明某些内容是SELECT子句中的别名,并期望它能够正常工作,因为该程序很可能从FROM子句开始。

另外,根据我的经验,当SELECT子句中相互引用时,列别名不能很好地相互协作。

我相当不幸的解决方案是不使用别名并输入整个内容。

另外,你绝对肯定不应该在WHERE子句中使用聚合函数。它必须始终在HAVING子句中。如果您不希望Oracle抱怨要求艺术家,您还需要使用GROUP BY子句。此外,由于您是由Artist分组而另一个函数是聚合,因此您不需要使用DISTINCT。