2009-05-04 16 views
0

誰かが私が作業しているSQLクエリで何か光を当てることができますか?同じ合計を返すクエリ - oracle sql

私はこのクエリを作成しました。それは私が変更するすべてのloactionためにそれをしない、

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; 

私はそれを実行するたびに、それはtotalcinemasalesのための各行の和のSAMのセットを返しますが、私は、データベースに座ってチケット販売などのさまざまなレベルがある知っていますどのように私はそれを改善することができるかについての任意のポインター?おそらくパフォーマンスで、CINEMAに参加するのを忘れ

おかげ

答えて

2

推測:あなたがそれに慣れるときは、ANSIを使用することができ

AND CINEMA.CINEMA_ID = PERFORMANCE.CINEMA_ID 

は、参加する、実際に読みやすいです:あなたがすることはできません

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(cinema_id)>を使っています(screen_id >> performance(run_id)それらのテーブルの両方に 'と'を追加するKS?またはansiが参加すると、私はそれをもっと聞いてみる必要があると感じます。 –

+0

はい、すべてのテーブルを結合する必要があります。そうでない場合、デカルト積が得られます。これは、Cinemaと結合された他のテーブルのすべての組み合わせが返されることを意味します。私が何を意味するかを見るには、select節からgroup by節とSUMを削除します。フィルタを使用すると、無駄な組み合わせがすべて削除されます。 –

+0

ステファンに感謝、それを与えるだろう –

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; 
関連する問題