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 子句中也指定了不需要的连接条件
movies
和 movie_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查看无效标识符的主要内容,如果未能解决你的问题,请参考以下文章