2013-09-05 2 views
0

У меня есть следующий SQL statmenetSQL - Invalid user.table.column

SELECT COUNT('Oprettet af Initialer') AS meetings_booked, 
     Dato salgstrin, 
     VTEAM.TEAM 
FROM  KS_DRIFT.DIAN_POT_OPR POT 
     RIGHT JOIN KS_DRIFT.V_TEAM_DATO VTEAM ON VTEAM.DATO = POT.'Dato salgstrin' 
WHERE exists (SELECT 1 FROM KS_DRIFT.V_TEAM_DATO WHERE KS_DRIFT.DIAN_POT_OPR.'Oprettet af Initialer' = KS_DRIFT.V_TEAM_DATO.INITIALER) 
AND  'Salgstri' NOT IN('01 - Muligt emne','02 - Aktivt emne') 
AND  'Oprettet dato' BETWEEN '2013-09-04' AND '2013-09-04' 
GROUP BY 'Dato salgstrin' 'Oprettet af Initialer', VTEAM.TEAM 
ORDER BY 'Dato salgstrin' 

Теперь, когда когда-либо я пытаюсь запустить это я получаю следующее сообщение об ошибке:

Invalid user.table.column, table.colum, or column specification 

Кто-нибудь знает, почему это происходит и как я могу это исправить?

Изображения таблиц

KS_DRIFT.DIAN_POT_OPR:

table1

KS_DRIFT.VTEAM_DATO:

enter image description here

+0

Является ли 'salgstrin' псевдоним для' Dato'? Что такое db? –

+0

Вы раскалываете нас, что такое 'Dato',' salgstrin' и 'Oprettet af Initialer' – Parado

+0

Это база данных оракула и нет 'Data salgstrin' - это строка, а 'Salgstri' - это строка, а также –

ответ

4

Колонка (и таблица) имена должны быть приложены в двойных кавычках, а не одинарные кавычки. Одиночные кавычки предназначены для строковых литералов («значения»).

'Oprettet af Initialer' является строкой, "Oprettet af Initialer" Имя столбца

Таким образом, вы, вероятно, хотите:

SELECT COUNT("Oprettet af Initialer") AS meetings_booked, 
     "Dato salgstrin", 
     VTEAM.TEAM 
FROM  KS_DRIFT.DIAN_POT_OPR POT 
     RIGHT JOIN KS_DRIFT.V_TEAM_DATO VTEAM ON VTEAM.DATO = POT."Dato salgstrin" 
WHERE exists (SELECT 1 FROM KS_DRIFT.V_TEAM_DATO WHERE KS_DRIFT.DIAN_POT_OPR."Oprettet af Initialer" = KS_DRIFT.V_TEAM_DATO.INITIALER) 
AND  "Salgstri" NOT IN ('01 - Muligt emne','02 - Aktivt emne') 
AND  "Oprettet dato" BETWEEN '2013-09-04' AND '2013-09-04' 
GROUP BY "Dato salgstrin", "Oprettet af Initialer", VTEAM.TEAM 
ORDER BY "Dato salgstrin" 

Пожалуйста, обратитесь к руководству для получения более подробной информации об этом: http://docs.oracle.com/cd/E11882_01/server.112/e26088/sql_elements008.htm#i27561

Редактировать

В вашем подзапросе есть еще одна ошибка:

KS_DRIFT.DIAN_POT_OPR."Oprettet af Initialer" и KS_DRIFT.V_TEAM_DATO.INITIALER являются недопустимыми ссылками на столбцы. Там есть один элемент. Ссылки столбцов всегда находятся в форме tableName.columnName или tableAlias.ColumnName. У них никогда не было трех элементов. Я не уверен, кто из них неверен в вашем случае.

Edit 2

Листинг «Oprettet аф Initialer» в GROUP BY пункта кажется немного странным, как вы используете этот столбец также в качестве части агрегатной функции (внутри счетчика).


Примечание стороны ваших значений DATE: указав дату, как этот '2013-09-04' подлежит неявное преобразование типов данных и является ли или не то, что работает, зависит от настроек NLS программного обеспечения клиента вы работаете - На моем компьютер, формат которого генерирует ошибку.

Это гораздо лучше явно указать формат даты находится в с помощью to_date() метода:

to_date('2013-09-04', 'YYYY-MM-DD') 

или если вы хотите, чтобы набрать немного меньше, вы можете использовать дату ANSI литерал, который задаются с помощью ключевого слова DATE в передней части ISO отформатированного строкового литерала:

DATE '2013-09-04' 
+0

Также: в подзапросе 'exists' есть ссылки, которые не используют псевдонимы таблицы. –

+0

И недостающая запятая в 'GROUP BY' –

+0

(+1)' Dato salgstrin' также является столбцом, и вы должны добавить запятую в группу: – Parado

0

Вы используете одиночные кавычки ', который используются для обозначения струнных ин tead использования двойных кавычек ", который используется, когда имена столбцов/таблиц имеют пробелы или зарезервированы имена, такие как USER или INDEX. Не удалил KS_DRIFT из имен таблиц, но вы должны иметь формат TableName.ColumnName, а не xxx.TableName.ColumnName.

Этот запрос должен работать (но вы должны исправить KS_DRIFT часть):

SELECT COUNT(POT."Oprettet af Initialer") AS meetings_booked, 
     POT."Dato salgstrin", 
     VTEAM.TEAM 
FROM  KS_DRIFT.DIAN_POT_OPR POT 
     RIGHT JOIN KS_DRIFT.V_TEAM_DATO VTEAM ON VTEAM.DATO = POT."Dato salgstrin" 
WHERE exists (SELECT 1 FROM KS_DRIFT.V_TEAM_DATO WHERE KS_DRIFT.DIAN_POT_OPR."Oprettet af Initialer" = KS_DRIFT.V_TEAM_DATO.INITIALER) 
AND  POT."Salgstri" NOT IN('01 - Muligt emne','02 - Aktivt emne') 
AND  POT."Oprettet dato" BETWEEN '2013-09-04' AND '2013-09-04' 
GROUP BY "Dato salgstrin", "Oprettet af Initialer", VTEAM.TEAM 
ORDER BY "Dato salgstrin" 

Чтобы избежать дальнейших проблем с названиями с пробелами, я предлагаю вам использовать ту _ характер.

Ссылаясь на Oracle Database Object Names and Qualifiers:

Note: Oracle does not recommend using quoted identifiers for database object names. These quoted identifiers are accepted by SQL*Plus, but they may not be valid when using other tools that manage database objects.


Extra: Если я не ошибаюсь, колонка "Oprettet dato"является ДАТА типа, и вы должны использовать функцию to_date() и изменить запрос с помощью этого WHERE статья:

AND "Oprettet dato" BETWEEN to_date('2013-09-04','YYYY-MM-DD') AND to_date('2013-09-04','YYYY-MM-DD')