2017-06-18 12 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

わかりません。 SQL標準は二重引用符に関して、それを必要とするOracleは、その実際にうまく 作業私の要件は、私はROW_NUMBERを与えると考える理由がある、最新の完了時間を持っていないレコードを削除しますクエリを記述することで、正確に –

+0

感謝を振る舞いますrow_number = 1を持たないレコードを削除する –

+0

@AmartyaSinha。 。 。別の質問をする必要があります。 'DELETE'操作は' SELECT'とは非常に異なります。あなたを助けようと、人々から、もともとの正解に - あなたが質問を変更する場合は、downvotesになることがすでに与えられた答えを、無効にする可能性があります。 –

関連する問題