我想将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
答案 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
答案 2 :(得分:0)
SQL的执行绝对不同于Java或C,因此通常会让新程序员加入该语言。
通常,数据库理解SQL指令的顺序如下:
FROM - >在哪里 - > GROUP BY - > ... - > SELECT
为了正确地执行此操作,您无法声明某些内容是SELECT子句中的别名,并期望它能够正常工作,因为该程序很可能从FROM子句开始。
另外,根据我的经验,当SELECT子句中相互引用时,列别名不能很好地相互协作。
我相当不幸的解决方案是不使用别名并输入整个内容。
另外,你绝对肯定不应该在WHERE子句中使用聚合函数。它必须始终在HAVING子句中。如果您不希望Oracle抱怨要求艺术家,您还需要使用GROUP BY子句。此外,由于您是由Artist分组而另一个函数是聚合,因此您不需要使用DISTINCT。