2013-01-21 105 views
1

我試圖運行下面的查詢:Oracle組通過查詢

SELECT parent_id, id, due_date, object_subtype 
    FROM amatia_logtask 
WHERE parent_id IN (SELECT id_actividad 
         FROM amatia_actividades 
         WHERE id_actividad = '12624' 
         OR id_padre = '12624') 
GROUP BY parent_id id 

不過,我無法理解的錯誤消息:

ORA-00933: SQL command not properly ended 
00933. 00000 - "SQL command not properly ended" 
*Cause:  
*Action: 
Error at Line: 9 Column: 41 

請你能提供一個解釋?

回答

2

GROUP BY子句是一個逗號分隔的列或表達式的列表,所以你錯過了一個逗號。

由於SELECT子句中的所有表達式都需要分組或聚合(使用aggregate functions),所以仍然會出現錯誤。

所以,你可能需要編寫:

SELECT parent_id, id, due_date, object_subtype 
    FROM amatia_logtask 
WHERE parent_id IN (SELECT id_actividad 
         FROM amatia_actividades 
         WHERE id_actividad = '12624' 
         OR id_padre = '12624') 
GROUP BY parent_id, id, due_date, object_subtype 

一個GROUP BY查詢,而不聚集本質上是一個DISTINCT查詢,所以你也可以使用不同的在這裏你的意圖暗示:

SELECT DISTINCT parent_id, id, due_date, object_subtype 
    FROM amatia_logtask 
WHERE parent_id IN (SELECT id_actividad 
         FROM amatia_actividades 
         WHERE id_actividad = '12624' 
         OR id_padre = '12624') 
+0

+1:Thx索引提醒 –

+0

通過這個查詢我得到重複的parent_id。我不需要具有相同parent_id的記錄,其他記錄是否相同。 – Napster

+0

@NisargPatel你的要求至少沒有說。如果我們不知道您的期望,不要期望解決方案成爲您想要的。 'DISTINCT'將在所有列中工作,不僅是第一個列,所以你不會得到兩個完全相同的'(parent_id,id,due_date,object_subtype)'集合。您可能想要的是按照[@OMG Ponies的回答](http://stackoverflow.com/a/14441218/119634)中的建議,僅通過'parent_id'進行分組。 –

3

您的GROUP BY兩列,並沒有逗號之間:

group by parent_id, id 
       ^--- missing this 

但是,如果你想組列上,那麼你就可以GROUP BY所有字段:

group by parent_id, id, due_date, object_subtype 
+0

對不起它不工作給予另一個錯誤 - > ORA-00979:不是GROUP BY表達式 00979. 00000 - 「不是一個GROUP BY表達式」 *原因: *動作: 誤差在行:1柱:22 – Napster

+0

這也沒有工作 SELECT PARENT_ID,ID,DUE_DATE,object_subtype FROM amatia_logtask WHERE PARENT_ID IN(SELECT id_actividad FROM amatia_actividades WHERE id_actividad = '12624' OR id_padre =「12624 ') GR OUP BY parent_id – Napster

+0

如果在查詢中有任何錯誤,請告訴我..我是oracle的新手.. – Napster

2

這是不清楚你在做什麼後 - 以下將給你一個清晰的列表

SELECT DISTINCT y.parent_id, y.id, y.due_date, y.object_subtype 
    FROM amatia_logtask y 
WHERE y.parent_id IN (SELECT x.id_actividad 
         FROM amatia_actividades x 
         WHERE '12624' IN (x.id_actividad, x.id_padre)) 

Oracle不允許您省略GROUP BY中的列,所以需要將其包含在聚合函數中。 IE:

SELECT y.parent_id, y.id, 
     MAX(y.due_date) AS due_date, MIN(y.object_subtype) AS object_subtype 
    FROM amatia_logtask y 
WHERE y.parent_id IN (SELECT x.id_actividad 
         FROM amatia_actividades x 
         WHERE '12624' IN (x.id_actividad, x.id_padre)) 
GROUP BY y.parent_id, y.id 
+0

+1,儘管您巧妙地使用IN運算符可能會阻止使用索引=) –

+0

我知道「GROUP BY」在ORACLE中不使用聚合函數進行查詢。但在這裏我不想使用聚合函數。請給我解決方案。 – Napster

+0

@OMGPonies: - 我只想通過parent_id記錄組。忘記所有其他的事情。你能幫我嗎? – Napster

0

嘗試這PLZ

SELECT parent_id, id, due_date, object_subtype 
    FROM amatia_logtask 
WHERE parent_id IN (SELECT id_actividad 
         FROM amatia_actividades 
         WHERE id_actividad = '12624' 
         OR id_padre = '12624') 
GROUP BY parent_id,id 

你只是缺少逗號在GROUP BY Clause.Good運氣