2010-09-17 74 views
3

我是一名SQL新手,我非常感谢在这个相当基本的问题上提供的一些帮助。SQL错误:无效的标识符

select comp_table.* 
from (select column_1,avg(column_2) as "avg" 
     from table_1, group by column_1) comp_table 

→返回正确的记录2列名为column_1avg

但如果我更改为:

select comp_table.avg 
from (select column_1,avg(column_2) as "avg" 
     from table_1, group by column_1) comp_table 

→回报错误:无效的标识符 “平均”

事情是我只需要选择avg列,所以我不能做select comp_table.*。你们能帮忙吗?

此外,如果您可以提供一些调整技巧的查询,这将是很棒的。

+2

@John Kugelman:→不错! – egrunin 2010-09-17 04:29:16

+0

这样的声音是[ORA-00904:无效标识符](http://www.dba-oracle.com/t_ora_00904_string_invalid_identifier.htm)... – 2010-09-17 04:48:10

回答

4

当列名未包含在“双引号”中时,名称被标准化为大写;因此,您要求列“AVG”,而列名实际上是“平均”:

select comp_table."avg" 
from (select column_1,avg(column_2) as "avg" 
    from table_1, group by column_1) comp_table 
+1

实际上,只有在我想用我的母语命名列标识符时,我才加双引号列标识符,否则我将它们保留为“原样”。最好不要使用与sum或avg等oracle函数名称匹配的标识符,以避免可能的混淆。 – 2010-09-17 07:56:20

+0

在PostgreSQL中使用双引号括起一个列名,使其区分大小写,即“mycolunm”与“myColumn”不同。我不知道其他数据库是否一样。 – Toto 2010-09-17 14:31:03

+0

在Oracle中,它有点不同。 ** ALL **列是用双引号指定的(从某种意义上说) - 只是它们给我们一个捷径,这意味着如果列只包含大写字母和/或下划线字符,我们可以省略双引号。然而,只有在Oracle中使用非引号语法来命名列,这是一个常见的约定。 – 2010-09-20 04:52:59

0

我不知道您正在使用哪个DBMS,但有些会因您使用.avg而感到不安(因为avg已被保留)并要求您将其转义。

尝试从avg将其更改为average,只是作为一个测试:

SELECT comp_table.average 
FROM (SELECT column_1, avg(column_2) as average 
     FROM table_1, GROUP BY column_1) comp_table 
+0

然后错误会是AVG函数缺少一个参数。在表别名之上使用...... – 2010-09-17 04:30:28

+0

TSQL是我所知道的唯一一个支持方括号来转义表,列和别名的方法,正如Emtucifor指出的那样 - SQL Server不会有这个问题。 – 2010-09-17 04:38:20

+0

@OMG小马:固定。 – egrunin 2010-09-17 13:59:59

1

什么数据库服务器您使用的? AVG是我所知道的所有内置函数,因此您需要正确地转义它 - 这取决于数据库服务器。在MS SQL Server中,它是[avg]

+0

然后错误会是AVG函数缺少一个参数。在表别名之上使用...... – 2010-09-17 04:29:38

相关问题