甲骨文视图无效标识符



>我必须实现

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

所以我做到了

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、价格。
MOVIE_COPIES表有:类型、store_id、movie_copy_id movie_number
电影表有:ID,名称,分钟。

但是甲骨文放弃了我

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

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

我能看到的问题是:

  1. 您在分组依据中得到了错误的列(它应该是选择中使用的非聚合列)。
  2. 您在 where 子句中也指定了不需要的连接条件
  3. 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;

示例 SQL 小提琴显示它的实际效果。

也许查询应该使用电影表作为源,并左联接其他表,或者可能使用内部联接,因为假设发生业务表中的任何行都必须与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。

最新更新