我遇到一行代码问题。我正在尝试为我创建的视图创建计数函数。我已经做了很多不同的方式,但下面是我最近使用的格式。
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)
部分。有什么想法我应该解决这个问题吗?
答案 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更先进的东西应该能够做到这一点。