2017-06-18 118 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”非常不同。如果你改变了这个问题,你很可能会使已经给出的答案失效,这可能导致降低成本 - 原本正确的答案来自试图帮助你的人。 –