2015-08-20 39 views
0

我有一個查詢使用GROUP BY,所以我需要把選中的項目在GROUP BY或在一個聚合函數。當我把它們放在GROUP BY中時,t2.category會在標題中引發錯誤。我試圖在CASE/WHEN聲明中加入集合函數,而不是將t2.category放入GROUP BY,但我得到invalid identifier錯誤。 t2.category的一個示例可能是「服務器可靠性 - 由於數據庫丟失導致的連接問題」。我怎樣才能擺脫這個錯誤?ORA-00923:預計 - 得到CLOB

SELECT 
msr._id, 

CASE ans.question_id WHEN '767' THEN ans.category END "767", 
CASE ans.question_id WHEN '768' THEN ans.category END "768" 

FROM table1 t1 
LEFT OUTER JOIN table2 t2 
ON t1._id = t2._id 

WHERE t2.question_id in (767,768) AND t2.assigned_to not in ('Smith, John') 
AND t1.request_type_id in (288,289) and t1.status_id not in (0, 11); 

GROUP BY t1._id, t2.question_id, t2.category 
+0

我假設't2.category'是基於錯誤的'clob'。是對的嗎? –

+0

是的。這是導致錯誤的部分。 – NoSocks

+0

[您無法通過CLOB進行分組](http://docs.oracle.com/cd/E11882_01/appdev.112/e18294/adlob_sql_semantics.htm#ADLOB45594)。你最多可以分組4000個字符,但如果那樣的話,你首先不需要CLOB。爲什麼當你在選擇列表中沒有聚合時,你有一個group by子句?這只是查詢的一部分嗎?如果你真的有聚合,顯示一個有代表性的查詢和表結構,也許有一種方法 - 比如聚合發生後加入到't2'。取決於你的數據。 –

回答

2

除了只使用CLOB值,這可能是不能接受的第一個4000個字符,只有這樣,我可以看到,以繞過restictions上的CLOB(including that you can't group by them)是加入到第二個表多次:

SELECT 
msr.id, 
ans_767.category AS "767", 
ans_768.category AS "768" 
FROM msr 
LEFT OUTER JOIN ans ans_767 
ON ans_767.id = msr.id 
AND ans_767.question_id = 767 
AND ans_767.assigned_to not in ('Smith, John') 
LEFT OUTER JOIN ans ans_768 
ON ans_768.id = msr.id 
AND ans_768.question_id = 768 
AND ans_768.assigned_to not in ('Smith, John') 
WHERE msr.request_type_id in (288,289) 
AND msr.status_id not in (0, 11); 

     ID 767     768     
---------- -------------------- -------------------- 
     1 back     dev 
     2      dev 

他們都是左加入,但意味着你只能得到一個行回來,所以沒有崩潰,你從兩排,你的版本得到的值。

我不得不將question_id過濾器移到ON條款中的每一個;但我也移動了assigned_to篩選器,因爲它在where子句中將外連接重新轉換爲內連接。

這是醜陋的,但可以忍受兩個問題ID,但在維護和可讀性方面不能很好地擴展。

SQL Fiddle demo,使用您上一個問題的值;和你的原始代碼(排序;編輯一下)failing

+0

這是完美的。謝謝! – NoSocks

+1

@NoSocks - 如果你仍然想要在MAX()中使用'dbms_lob.substr'的​​前4000個字符的解決方法。 [演示](http://sqlfiddle.com/#!4/3ba86/6)。如果你在11gR2上,你也可以使用'pivot'和short值,這就是你手動做的。如果您將類別長度降低很多,那麼使用CLOB列沒有多大意義。 –