2012-03-05 49 views
2

林相当在SQL初学者,我一直在现在的问题是这个东西想锻炼几个小时: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

您可以改为“GROUP BY g.NAME”吗? – 2012-03-05 18:32:46

+0

尝试在GROUP BY和ORDER BY子句中使用'g.Name'而不是'GENRE_TYPE'。 – 2012-03-05 18:33:50

+0

请停止使用隐式连接语法。这是一个非常ppor编程技术。即时交叉连接更容易维护,更可能是正确的。 – HLGEM 2012-03-05 18:38:13

回答

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; 
+0

虽然我怀疑你的答案会起作用,但我会降低任何使用隐式联接的SQl Antipattern的方法。我们不应该鼓励糟糕的编程技术。 – HLGEM 2012-03-05 18:39:18

+2

我们中的一些人学会了在ANSI连接语法被支持之前编写SQL。 Oracle 8i并不是很久以前。 – 2012-03-06 06:22:50

0

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

+0

非常感谢您的支持。 再看看这整个代码,我发现了一些我以前必须忽略的问题,包括FROM语句中的一些表。 看起来像生病了从未来! – 2012-03-05 18:50:21

1

问题是在选择列表中引入的列别名不能用在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语句中使用显式连接符号(如上所示)总是