2013-09-05 40 views
0

我有以下SQL statmenetSQL - 無效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'的別名嗎?這是什麼分貝? –

+0

您認爲我們是什麼'Dato','salgstrin'和'Oprettet af Initialer' – Parado

+0

這是一個oracle數據庫,並且沒有'數據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.columnNametableAlias.ColumnName的格式。他們從來沒有三個要素。我不確定你的案件中哪些是不正確的。

編輯2

清單「Oprettet AF Initialer」在GROUP BY子句您使用的列也爲聚合函數(計數內)的一部分,似乎有點奇怪。


您DATE值旁註:指定日期這樣'2013-09-04'受IMPLICT數據類型的轉換,以及是否該運行方式取決於您正在使用的客戶端軟件的NLS設置 - 在我電腦格式會產生錯誤。

這是更好地利用to_date()方法來明確地陳述格式的日期是:

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

,或者如果你想輸入一個少一點,你可以使用ANSI日期文字哪些

DATE '2013-09-04' 
+0

另外:在'exists'子查詢中有沒有使用表別名的引用。 –

+0

「GROUP BY」中缺少逗號 –

+0

(+1)'Dato salgstrin'也是一個列,並且您應該爲組添加逗號 – Parado

0

您正在使用單引號'用來標記字符串插件:通過在ISO格式的字符串文字的前面使用關鍵字DATE指定使用雙引號",用於列/表名具有空格或保留名稱,如USERINDEX。沒有從表格名稱中刪除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.


超:如果我沒看錯,列"Oprettet dato"DATE類型,你應該使用to_date()功能和使用該WHERE修改查詢子句:

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