2017-06-18 83 views
-1

我有如下表:SQL解析函數無效的錯誤

EMP_ID COURSE_ID COMPLETION_TIME 
1  c1   11-APR-99 
1  c1   15-APR-99 
1  c1   17-APR-99 
2  c2   14-FEB-99 
2  c2   18-FEB-99 

,我使用此查詢:

SELECT e.emp_id, 
     e.course_id, 
     e.completion_time 
FROM (SELECT emp_id, 
       course_id, 
       completion_time, 
       Row_number() 
       over( 
        PARTITION BY emp_id, course_id 
        ORDER BY completion_time DESC) AS "rn" 
     FROM amartya) e 
WHERE rn = 1; 

它總是顯示我

ORA-00904 , 不合法的識別符。

我不明白什麼是混淆的問題。請幫忙。

回答

2

您在FROM子查詢中錯誤地使用了別名。取出圍繞rn字段的雙引號。

SELECT e.emp_id, 
     e.course_id, 
     e.completion_time 
FROM (SELECT emp_id, 
       course_id, 
       completion_time, 
       Row_number() 
       over( 
        PARTITION BY emp_id, course_id 
        ORDER BY completion_time DESC) AS rn 
     FROM amartya) e 
WHERE e.rn = 1; 
2

對於雙引號,Oracle很挑剔,因爲它遵循SQL標準。除非需要(不要使用它們(然後使用從不需要引號的列別名!)。您的查詢更清晰的形式是:

SELECT a.emp_id, a.course_id, a.completion_time 
FROM (SELECT a.*, 
      row_number() over (partition by emp_id, course_id 
           order by completion_time desc 
           ) as rn 
     FROM amartya a 
    ) a 
WHERE rn = 1; 

根本問題是雙引號。

當然,大多數人會寫這個查詢爲:

SELECT a.emp_id, a.course_id, MAX(a.completion_time) as completion_time 
FROM amartya a 
GROUP BY a.emp_id, a.course_id; 

這得到周圍所有的問題,並更容易理解。

+1

不確定「finicky」是什麼意思。 Oracle的行爲與SQL標準所要求的雙引號完全相同 –

+0

感謝它的工作 實際上,我的要求是編寫一個查詢,它將刪除沒有最後完成時間的記錄,這就是爲什麼我想給row_number然後刪除沒有row_number = 1 –

+0

@AmartyaSinha的記錄。 。 。你應該問另一個問題。 「DELETE」操作與「SELECT」非常不同。如果你改變了這個問題,你很可能會使已經給出的答案失效,這可能導致降低成本 - 原本正確的答案來自試圖幫助你的人。 –