我是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
非常感谢支持!
答案 0 :(得分:5)
尝试在group by
和order 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中。