2010-09-17 4 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_1 и avg

Но если я изменяю:

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

+0

Похоже, что это [ORA-00904: Неверный идентификатор] (http://www.dba-oracle.com/t_ora_00904_string_invalid_identifier.htm) ... –

ответ

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

Фактически, я дважды указываю идентификаторы столбцов, только если я хотел бы назвать их на своем родном языке, иначе я оставлю их «как есть». Также было бы хорошей практикой не использовать идентификаторы, соответствующие именам функций oracle, например sum или avg, чтобы избежать возможных недоразумений. –

+0

В PostgreSQL заключить имя столбца в двойную кавычку, делает его чувствительным к регистру, то есть «mycolunm» отличается от «myColumn». Я не знаю, одинаково ли для других баз данных. – Toto

+0

В Oracle это немного отличается. ** ВСЕ ** столбцы задаются с использованием двойных кавычек (в некотором смысле) - это просто то, что они дают нам короткое сокращение, что означает, что мы можем опустить двойные кавычки, если только в столбцы включены заглавные буквы и/или символы подчеркивания. Однако принято использовать только не цитируемый синтаксис для именования столбцов в Oracle. –

0

Я не знаю, какую СУБД вы используете, но некоторые из вас будут расстроены тем, что вы используете .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 отсутствует параметр. В верхней части таблицы используется псевдоним ... –

+0

TSQL - единственное, что я знаю о том, что поддерживает квадратные скобки, чтобы избежать имен таблиц, столбцов и псевдонимов, что, как отметил Эмтусифор, - SQL Server не будет иметь этой проблемы. –

+0

@OMG Ponies: исправлено. – egrunin

1

Какой сервер базы данных вы используете? AVG - это встроенная функция во всех, о которых я знаю, поэтому вам нужно будет сбежать от нее правильно - что зависит от сервера базы данных. В MS SQL Server это [avg]

+0

Тогда ошибка была бы в том, что функция AVG не имеет параметра. В верхней части таблицы используется псевдоним ... –

Смежные вопросы