2

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

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)代码的一部分。任何想法我应该如何解决这个问题?

4

5 回答 5

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
于 2009-12-07T15:08:13.783 回答
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
于 2009-12-07T15:07:03.533 回答
1

正如托尼指出的那样,您的陈述中实际上存在几个语法错误。缺少的括号只是第一个。

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

于 2009-12-07T15:16:34.643 回答
1
CREATE VIEW ERP_REPORT(EVENTNAME, DESCRIPTION, COUNT(RIDERS) AS

……

不应该是:

CREATE VIEW ERP_REPORT(EVENTNAME, DESCRIPTION, COUNT(RIDERS)) AS
于 2009-12-07T15:02:36.810 回答
1

正如错误消息指出的那样,您缺少右括号)。括号在这里打开:'ERP_REPORT(EVENTNAME'并且永远不会关闭。

于 2009-12-07T15:02:37.160 回答