oracle查看无效标识符

Posted

技术标签:

【中文标题】oracle查看无效标识符【英文标题】:Oracle view invalid identifier 【发布时间】:2015-04-22 23:02:40 【问题描述】:

我必须执行

创建一个视图,显示数据库中每部电影的总租金收入

原来如此

CREATE OR REPLACE VIEW MovieIncome AS SELECT s.movie_copy_id, SUM(S.PRICE)
AS Income FROM TRANSACTIONS s
left OUTER JOIN MOVIE_COPIES ON MOVIE_COPIES.movie_copy_id = s.movie_copy_id
left OUTER JOIN MOVIES ON MOVIES.ID = MOVIE_COPIES.MOVIE_copy_id
WHERE MOVIES.ID = MOVIE_COPIES.MOVIE_copy_id
GROUP BY MOVIES.NAME;

交易表有:transaction_id、movie_copy_id、customer_id、price。 MOVIE_COPIES 表有:type、store_id、movie_copy_id、movie_number MOVIES 表有:id、name、minutes。

但是甲骨文放弃了我

ORA-00904: "S"."MOVIE_COPY_ID": invalid identifier

我的朋友有同样的任务,他的专栏名称不同,但目的相同,工作正常,对我来说不是。

【问题讨论】:

您确定您向我们展示了正确的陈述吗?语句中没有 Transaction_ID (已修复)是​​的,我在 Transactions 表中有 transaction_id :/ 但是你的语句中没有,所以我认为这个语句和exeption没有关联 你说得对,我在尝试不同的列,现在已修复 请编辑您的问题并包含此查询中涉及的表的定义(列名和数据类型)。谢谢。 【参考方案1】:

我能看到的问题是:

    您在 group by 中得到了错误的列(它应该是 select 中使用的非聚合列)。 您在 where 子句中也指定了不需要的连接条件 moviesmovie_copies 表之间的连接可能应该在 movies.id = movie_copies.movie_number 上(不过这只是猜测)。

此代码有效:

CREATE OR REPLACE VIEW MovieIncome AS 
SELECT s.movie_copy_id, MOVIES.NAME, SUM(S.PRICE) AS Income 
FROM TRANSACTIONS s
LEFT OUTER JOIN MOVIE_COPIES ON MOVIE_COPIES.movie_copy_id = s.movie_copy_id
LEFT OUTER JOIN MOVIES ON MOVIES.ID = MOVIE_COPIES.movie_number
GROUP BY s.movie_copy_id, MOVIES.NAME;

Sample SQL Fiddle 正在展示它。

也许查询应该使用 movies 表作为源,然后左连接其他表,或者可能使用内部连接,因为可以安全地假设 transactions 表中的任何行都必须与 movie_copies 表有关系.

所以也许你想要的是这样的:

CREATE OR REPLACE VIEW MovieIncome AS 
SELECT MOVIE_COPIES.movie_copy_id, MOVIES.NAME, COALESCE(SUM(S.PRICE),0) AS Income 
FROM MOVIES
LEFT OUTER JOIN MOVIE_COPIES ON MOVIES.ID = MOVIE_COPIES.movie_number
LEFT OUTER JOIN TRANSACTIONS s ON MOVIE_COPIES.movie_copy_id = s.movie_copy_id
GROUP BY MOVIE_COPIES.movie_copy_id, MOVIES.NAME;

对于根本没有出租拷贝的电影,这将返回 0。

【讨论】:

我不需要返回0,我需要返回每部电影的总价格,我检查名称是否与副本相同,带有交易副本。 你写的第一个代码对我不起作用,仍然收到同样的问题。 @RenatasValatka 如果您查看我链接的 SQL Fiddle,除了数据类型之外,您的代码有什么不同吗?如果列名与您描述的一样并且查询文本相同,它应该可以工作,就像小提琴所示。 @RenatasValatka 所以代码是相同的,但你还是得到了错误?这听起来很奇怪。

以上是关于oracle查看无效标识符的主要内容,如果未能解决你的问题,请参考以下文章

Oracle SQL 创建视图无效标识符

Oracle,无效标识符错误

为啥我会收到:[Oracle][ODBC][Ora]ORA-00904:标识符无效

更新时标识符无效 (Oracle)

Oracle 11g 无效标识符错误

oracle 忽略子查询中的无效标识符错误