2012-03-05 24 views
2

イムかなりSQLの初心者と私は今、問題はこれである何時間ワークアウトにしようとしてきた:私はGENRE.NAME列に問題がなければならないと思わせるSQL - 無効な識別子ですが、どこにありますか?

SELECT COUNT (DISTINCT c.BAND_ID)Number_of_bands, COUNT(DISTINCT c.COMP_ID)"Total_Competitions",g.NAME GENRE_TYPE 
FROM ENTERED_COMPS ec,COMPETITIONS c,GENRE g 
WHERE c.COMP_ID = ec.COMP_ID 
AND g.GENRE_ID = c.GENRE_ID 
AND c.BAND_ID = b.BAND_ID 
GROUP BY GENRE_TYPE 
ORDER BY GENRE_TYPE ASC; 

Oracle just comes up with the error 
ORA-00904: "GENRE_TYPE": invalid identifier 
00904. 00000 - "%s: invalid identifier" 
*Cause:  
*Action: 
Error at Line: 6 Column: 9 

.. ..名前が間違っているかスペルが間違っています。しかし、そうではありません。

アルファベット順に出力し、各ジャンルの競技会を開催する回数と各競技に入ったバンドの数を示すことで、ジャンルの比較人気を分析しようとしていますジャンル。

これは少し簡単にするためにここに私のERDへのリンクがあります - http://www.missingstudios.com/matt/ERD%20Logical.pdf

サポートがはるかに高く評価されるだろう!

+0

代わりに 'GROUP BY g.NAME'に変更できますか? –

+0

GROUP BY句とORDER BY句の両方で 'GENRE_TYPE'ではなく' g.Name'を使用してみてください。 –

+0

暗黙的な結合構文の使用をやめてください。これは非常にpporのプログラミングテクニックです。暗黙的な結合は、偶発的な相互結合が維持しやすく、正しい可能性がはるかに低い。 – HLGEM

答えて

5

は、あなたのERDが正確であると仮定すると、あなたのgroup byorder by

SELECT COUNT (DISTINCT c.BAND_ID) Number_of_bands, 
     COUNT(DISTINCT c.COMP_ID) Total_Competitions, 
     g.NAME GENRE_TYPE 
FROM ENTERED_COMPS ec,COMPETITIONS c,GENRE g 
WHERE c.COMP_ID = ec.COMP_ID 
AND g.GENRE_ID = c.GENRE_ID 
AND c.BAND_ID = b.BAND_ID 
GROUP BY g.NAME 
ORDER BY g.NAME ASC; 
+0

私はあなたの答えがうまくいくと思うが、暗黙的な結合のSQl反パターンを使用するものはどれも下線を引く。我々はプログラミングの技術が貧弱であることを奨励してはならない。 – HLGEM

+2

私たちの中には、ANSI結合構文がサポートされる前にSQLを書くことを学んだ人がいました。 Oracle 8iはずっと前ではありませんでした。 –

0

にエイリアスを残して試してみてください、エラーメッセージは正確に正しいです。 GENRE_TYPEは無効な識別子です。あなたのERDにはありません。

+0

ご協力いただきありがとうございます。 このコード全体をもう一度見て、私は以前にFROMステートメントのいくつかのテーブルを含めて無視しなければならなかったいくつかの問題を発見しました。 未来のために病気のように見えます! –

1

select-listに導入された列エイリアスは、GROUP BY句とORDER BY句で使用できないという問題があります。また、FROM句に表示されないテーブル別名 'b'も参照します。

SELECT COUNT(DISTINCT c.BAND_ID) Number_of_bands, 
     COUNT(DISTINCT c.COMP_ID) "Total_Competitions", 
     g.NAME GENRE_TYPE 
    FROM ENTERED_COMPS ec 
    JOIN COMPETITIONS c ON c.COMP_ID = ec.COMP_ID 
    JOIN GENRE   g ON g.GENRE_ID = c.GENRE_ID 
    JOIN BAND   b ON c.BAND_ID = b.BAND_ID 
GROUP BY g.NAME 
ORDER BY g.NAME ASC; 

SQLのいくつかのバリエーションでは、ORDER BY句にエイリアスを使用できます。より一般的に認められるものもあります。それは混乱の原因です。 (一部のDBMSはSQL標準に準拠しており、テーブル名とエイリアスの間でASを使用できますが、Oracleでは使用できません)。

古典的な暗黙的な結合表記法を教えてくれた理由を教えてください。新しいSQLを作成するのではなく、変更していない古いSQLを理解するためにのみ学んでください。 常には、新しいSQL文で明示的な結合表記法(上記のように)を使用する必要があります。

関連する問題