2009-05-04 5 views
0

Удивительно, если кто-нибудь может пролить свет на sql-запрос, с которым я работаю;Запрос, возвращающий те же суммы - oracle sql

Я построил этот запрос;

SELECT SUM(TICKET_TYPE.PRICE) AS TOTALCINEMASALES, CINEMA.LOCATION, PERFORMANCE.PERFORMANCE_DATE 
FROM RESERVATION, TICKET, TICKET_TYPE, CINEMA, PERFORMANCE 
WHERE TICKET_TYPE.TICKET_TYPE_ID = TICKET.TICKET_TYPE_ID 
     AND TICKET.RESERVATION_ID = RESERVATION.RESERVATION_ID 
     AND RESERVATION.PERFORMANCE_ID = PERFORMANCE.PERFORMANCE_ID 
     AND CINEMA.LOCATION = 'SKIPTON' 
     AND PERFORMANCE.PERFORMANCE_DATE BETWEEN to_date('01/03/2009','DD/MM/yyyy') AND to_date('07/04/2009','DD/MM/yyyy') 
GROUP BY 
     CINEMA.LOCATION, PERFORMANCE.PERFORMANCE_DATE 
ORDER BY 
     TOTALCINEMASALES; 

Каждый раз, когда я запускаю его, он возвращает набор SaM сумм по каждой строке для totalcinemasales, но я знаю, что есть разные уровни продаж билетов и т.д. сидевшие в базе данных, он делает это для каждой локации, меняю , любые указатели относительно того, как я мог бы улучшить его?

Благодаря

ответ

2

Вы забыли присоединиться CINEMA, вероятно, с ИСПОЛНЕНИЯ.

Guess:

AND CINEMA.CINEMA_ID = PERFORMANCE.CINEMA_ID 

Вы можете использовать ANSI включается, когда вы привыкнете к нему, это на самом деле легче читать:

SELECT SUM(TICKET_TYPE.PRICE) AS TOTALCINEMASALES, CINEMA.LOCATION, PERFORMANCE.PERFORMANCE_DATE 
FROM  
    TICKET 
    inner join TICKET_TYPE 
    on TICKET_TYPE.TICKET_TYPE_ID = TICKET.TICKET_TYPE_ID 
    inner join RESERVATION 
    on TICKET.RESERVATION_ID = RESERVATION.RESERVATION_ID 
    inner join PERFORMANCE 
    on RESERVATION.PERFORMANCE_ID = PERFORMANCE.PERFORMANCE_ID 
    inner join CINEMA /* the missing link */ 
    on CINEMA.CINEMA_ID = PERFORMANCE.CINEMA_ID 
WHERE 
    CINEMA.LOCATION = 'SKIPTON' 
    AND PERFORMANCE.PERFORMANCE_DATE BETWEEN to_date('01/03/2009','DD/MM/yyyy') AND to_date('07/04/2009','DD/MM/yyyy') 
GROUP BY 
     CINEMA.LOCATION, PERFORMANCE.PERFORMANCE_DATE 
ORDER BY 
     TOTALCINEMASALES; 
+0

Спасибо, что вы не можете (возможно, причина проблемы после прочтения вашего предложения) заключается в том, что нет прямой связи с производительностью до кино, я использовал кинематограф (screen_id)> run (screen_id >> performance (run_id)). Должен ли я включать обе эти таблицы и добавление 'и' для lin кс? или ansi присоединяется, allthoug, я чувствую, что мне нужно, чтобы я услышал, что это больше. – 2009-05-04 13:21:40

+0

Да, вам нужно присоединиться ко всем таблицам. Если вы этого не сделаете, вы получите Cartesian Product, это означает, что все комбинации Cinema и присоединенных других таблиц возвращаются. Чтобы понять, что я имею в виду, удалите предложение group by и SUM из предложения select. С фильтром вы удаляете все бесполезные комбинации. –

+0

благодарит Стефана, даст это – 2009-05-04 14:27:53

0
SELECT SUM(TICKET_TYPE.PRICE) AS TOTALCINEMASALES, CINEMA.LOCATION, PERFORMANCE.PERFORMANCE_DATE 
FROM RESERVATION, TICKET, TICKET_TYPE, CINEMA, PERFORMANCE 
WHERE TICKET_TYPE.TICKET_TYPE_ID = TICKET.TICKET_TYPE_ID 
     AND TICKET.RESERVATION_ID = RESERVATION.RESERVATION_ID 
     AND RESERVATION.PERFORMANCE_ID = PERFORMANCE.PERFORMANCE_ID 
     AND CINEMA.LOCATION = 'SKIPTON' 
-- Added this 
     AND PERFORMANCE.CINEMA_ID = CINEMA.CINEMA_ID 
-- 
     AND PERFORMANCE.PERFORMANCE_DATE BETWEEN to_date('01/03/2009','DD/MM/yyyy') AND to_date('07/04/2009','DD/MM/yyyy') 
GROUP BY 
     CINEMA.LOCATION, PERFORMANCE.PERFORMANCE_DATE 
ORDER BY 
     TOTALCINEMASALES; 
Смежные вопросы