2015-04-22 3 views
0

Я должен реализоватьвид Oracle недопустимый идентификатор

Создайте представление, которое показывает общий доход от аренды за фильм в базе данных

Так что я сделал таблицу

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
В таблице MOVIES есть: id, name, minutes.

Но Oracle падает мне

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

Мой друг имеет ту же задачу, и его столбцы разные имена, но это же цель и работает отлично, для меня это не так.

+0

Вы уверены, что хотите высказать свое мнение? Нет значения Transaction_ID в заявлении –

+0

(исправлено) Да, у меня есть транзакция в таблице Транзакции:/ –

+0

Но это не в вашем заявлении, поэтому я не думаю, что это утверждение и исправление коррелированы. –

ответ

0

вопросов я мог увидеть:

  1. что вы получили неправильный столбец в группе (она должна быть необобщенными столбцами, используемые в избранном).
  2. Это можно указать условие объединения в котором пункт который тоже не нужен
  3. Это соединение между столом и 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 показывая его в действии.

Возможно, запрос должен использовать таблицу фильмов как источник, хотя и левый, присоединяется к другим таблицам или, возможно, использует внутренние соединения, так как следует быть уверенным в том, что любая строка в таблице транзакций должна иметь отношение к 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

Мне не нужно возвращать 0, мне нужно возвратить цену tolal каждого фильма, я убедитесь, что имя будет таким же, как и копия, с копией транзакции. –

+0

Первый код, который вы написали, в любом случае не работает для меня, все еще получая такую ​​же проблему. –

+0

@RenatasValatka Если вы посмотрите на связанный SQL-скрипт, что-то другое в вашем коде, кроме типов данных? Если имена столбцов похожи на то, что вы описали, и текст запроса одинаковый, он должен работать, как показывает скрипка. – jpw

Смежные вопросы