找不到“缺少右括号”错误的原因

时间:2009-12-07 14:59:59

标签: oracle view sqlplus ora-00907

我遇到一行代码问题。我正在尝试为我创建的视图创建计数函数。我已经做了很多不同的方式,但下面是我最近使用的格式。

CREATE VIEW ERP_REPORT(EVENTNAME, DESCRIPTION, COUNT(RIDERS) AS
SELECT EVENTNAME, RACES.DESCRIPTION, 
       RIDERS_FIRSTNAME||' '||RTRIM(RIDERS_LASTNAME)
FROM EVENTS, RACES, PARTICIPATION, RIDERS
WHERE EVENTS.EVENTID = RACES.EVENTID
AND RACES.RACEID = PARTICIPATION.RACEID
AND RIDERS.RIDERID = PARTICIPATION.RIDERID
ORDER BY RIDERS.RIDERS_LASTNAME, EVENTNAME;

我得到的错误是ORA-00907: missing right parenthesis。错误发生在代码的(COUNT(RIDERS)部分。有什么想法我应该解决这个问题吗?

5 个答案:

答案 0 :(得分:6)

第1行括号中的名称列表应为视图列的名称:

CREATE VIEW ERP_REPORT(EVENTNAME, DESCRIPTION, COUNT(RIDERS) AS ...

您无法创建名为“COUNT(RIDERS”或甚至“COUNT(RIDERS)”的列,因为列名可能不包含(或)。这样可行:

CREATE VIEW ERP_REPORT(EVENTNAME, DESCRIPTION, RIDER_FULL_NAME) AS ...

然而,看起来你真的想要一些东西,虽然我不知道是什么。要做到这一点,视图定义必须是:

CREATE VIEW ERP_REPORT(EVENTNAME, DESCRIPTION, RIDER_COUNT) AS
SELECT EVENTNAME, RACES.DESCRIPTION, COUNT(*)
FROM EVENTS, RACES, PARTICIPATION, RIDERS
WHERE EVENTS.EVENTID = RACES.EVENTID
AND RACES.RACEID = PARTICIPATION.RACEID
AND RIDERS.RIDERID = PARTICIPATION.RIDERID
GROUP BY EVENTNAME, DESCRIPTION;

(即COUNT函数进入SELECT部分​​,而不是列名列表中。)

顺便说一句,由于您可能是Oracle的新手,我建议您开始使用更现代的ANSI连接语法来使您的查询更清晰:

...
FROM EVENTS
JOIN RACES ON RACES.EVENTID = EVENTS.EVENTID
JOIN PARTICIPATION ON PARTICIPATION.RACEID = RACES.RACEID
JOIN RIDERS ON RIDERS.RIDERID = PARTICIPATION.RIDERID

答案 1 :(得分:1)

CREATE VIEW ERP_REPORT(EVENTNAME, DESCRIPTION, COUNT(RIDERS) AS

....

不应该是:

CREATE VIEW ERP_REPORT(EVENTNAME, DESCRIPTION, COUNT(RIDERS)) AS

答案 2 :(得分:1)

正如错误消息所指出的那样,你错过了一个结束括号)。括号在这里打开:'ERP_REPORT(EVENTNAME',永远不会关闭。

答案 3 :(得分:1)

除非您在引号周围添加引号,否则不能在列名中包含括号。试试这个:

CREATE VIEW ERP_REPORT(EVENTNAME, DESCRIPTION, "COUNT(RIDERS)") AS ...

CREATE VIEW ERP_REPORT(EVENTNAME, DESCRIPTION, COUNT_RIDERS) AS ...

例如:

SQL> CREATE OR REPLACE VIEW foo ("count(*)") AS SELECT COUNT(*) FROM dual;

View created

SQL> CREATE OR REPLACE VIEW foo (count_all) AS SELECT COUNT(*) FROM dual;

View created

答案 4 :(得分:1)

正如Tony指出的那样,你的语句中实际上有几个语法错误。缺少的括号只是第一个。

我觉得有一个IDE支持括号匹配很有用,因为很难回过头代码并找到哪个支架没有配对。碰巧我的选择是TextPad,但几乎任何比NotePad更先进的东西应该能够做到这一点。