SQL - 无效的标识符,但在哪里?

时间:2012-03-05 18:29:38

标签: sql database oracle

我是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

这让我觉得GENRE.NAME列一定有问题....名称不正确或拼写错误。然而情况并非如此......

我试图通过按字母顺序输出它们来分析比较流行的类型,并显示每种类型的比赛数量以及有多少乐队已进入每种类型的比赛。

为了使这更简单,这里是我的ERD的链接 - http://www.missingstudios.com/matt/ERD%20Logical.pdf

非常感谢支持!

3 个答案:

答案 0 :(得分:5)

尝试在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;

答案 1 :(得分:1)

问题是select-list中引入的列别名不能在GROUP BY和ORDER BY子句中使用。您还可以参考表格别名' b'这不会出现在FROM子句中。

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语句中使用显式连接表示法(如上所示)。

答案 2 :(得分:0)

假设您的ERD准确无误,错误消息完全正确。 GENRE_TYPE是无效的标识符。它不在您的ERD中。