2010-09-12 57 views
2

因此,我整晚都在這樣做 - 不能完全理解我的作業,可悲的是我的教授在週末不能上班。這裏是:找到每個城市中顯示的最新電影的標題。顯示按城市名稱和電影標題排序的城市名稱和最新電影標題。Oracle SQL問題

這裏是我的表格聲明(並感謝大家今晚幫助我,我欠你一大筆時間)。

CREATE TABLE Theatres (
Name varchar2(50) not null, 
City varchar2(50) not null, 
State varchar2(50) not null, 
Zip number not null, 
Phone varchar2(50) not null, 
PRIMARY KEY (Name) 
); 

CREATE TABLE Movies (
Title varchar2(100) not null, 
Rating NUMBER not null, 
Length NUMBER not null, 
ReleaseDate date not null, 
PRIMARY KEY (Title), 
CHECK (Rating BETWEEN 0 AND 10), 
CHECK (Length > 0), 
CHECK (ReleaseDate > to_date('1/January/1900', 'DD/MONTH/YYYY')) 
); 
CREATE TABLE ShownAt (
TheatreName varchar2(50) not null, 
MovieTitle varchar2(100) not null, 
PRIMARY KEY (TheatreName, MovieTitle), 
FOREIGN KEY (TheatreName) REFERENCES Theatres(Name), 
FOREIGN KEY (MovieTitle) REFERENCES Movies(Title) 
); 

這裏是我到目前爲止(基於其他的StackOverflow成員的幫助下,從前面的問題):

SELECT m.title AS m_title, 
      t.city, 
      m.title 
    FROM THEATRES t 
    JOIN SHOWNAT sa ON sa.theatrename = t.name 
    JOIN MOVIES m ON m.title = sa.movietitle 
GROUP BY t.city, m.title 
ORDER BY m_title DESC 

顯然,我的問題是在宣佈最新的電影 - 我怎麼能解釋這種?我通過實例學習 - 一旦有人向我展示了一種方式,我可以將其應用於其他任何事情 - 請幫助。

+0

那麼你的問題是什麼? – duffymo 2010-09-12 03:13:53

+0

我的問題是我不確定如何解釋在每個城市播放的最新電影。不知道如何在SQL語句中聲明 – 2010-09-12 03:15:35

+0

您需要'ORDER BY ReleaseDate',然後選擇結果中的前N行以顯示N個最新電影。 – 2010-09-12 03:37:34

回答

4

的問題是真窮,因爲要知道什麼是唯一的出路「最新」是由MOVIE.releasedate值,這將是所有城市一樣,因爲發佈日期應該已經存儲在SHOWNAT表中的每個城市組合&電影。

這將列出所有的電影在數據庫中,最新的電影在頂部:

SELECT m.title, 
     t.city 
    FROM THEATRES t 
    JOIN SHOWNAT sa ON sa.theatrename = t.name 
    JOIN MOVIES m ON m.title = sa.movietitle 
ORDER BY m.releasedate DESC, m.title, t.city 

,僅保留最新的電影,我會使用分析功能(支持8I +,但有可能超出範圍你的類):

SELECT x.city, 
     x.title    
    FROM (SELECT t.city, 
       m.title, 
       ROW_NUMBER() OVER(PARTITION BY t.city 
             ORDER BY m.releasedate) AS rank 
      FROM THEATRES t 
      JOIN SHOWNAT sa ON sa.theatrename = t.name 
      JOIN MOVIES m ON m.title = sa.movietitle) x 
    WHERE x.rank = 1 
ORDER BY x.city, x.title 

得到比最上面的電影多,改變WHERE x.rank = 1到:

WHERE x.rank <= 3 

...獲得最近發佈的三部電影。更改以滿足您的需求。

+0

,但不是每部電影都會顯示在每個城市。 – Randy 2010-09-12 03:25:35

+1

@Randy:如果電影沒有在城市玩,那麼就不會有城市和電影上市的組合。首先按城市或電影名稱排序不會改變這一事實。 – 2010-09-12 03:28:08

+0

這聽起來不錯,儘管我在課堂上聽起來有點高級,但它產生了期望的結果,所以我不能抱怨 - 非常感謝。說實話,我還沒有看到你之前和Rank做過什麼,所以這很酷,看看它是如何完成的:) – 2010-09-12 04:04:32

0
Select m.Title, t.city 
from Theatres t 
inner join ShownAt s ON t.Name = s.TheatreName 
inner join Movies m ON s.MovieTitle = m.Title 
order by m.ReleaseDate Desc, t.Name, m.Title 
1

您將使用MAX聚合函數來查找顯示的每部電影的最大releasedDate值。

MAX將需要一個GROUP BY子句,您可以在查找最大值時指定使用哪個集合。

+0

主鍵是電影標題,所以不太可能會有重複的電影具有不同的發行日期。 – 2010-09-12 03:29:23

0

內部選擇獲取每個城市的最新節目,外部選擇獲取所有匹配的電影。

select m.title, t.city, m.releasedate 
from theatres t, movies m, shownat s 
where t.name = s.theatrename and m.title = s.movietitle 
and (t.city, m.releasedate) in (
    select t1.city, max(m1.releasedate) 
    from theatres t1, movies m1, shownat s1 
    where t1.name = s1.theatrename and m1.title = s1.movietitle 
    group by t1.city 
); 
0

'OVER PARTITION BY'不起作用,如果兩部電影具有相同的最新釋放,因爲只有其中一個將被返回。如果(n + 1)個電影在使用'WHERE x.rank < = n'時具有相同的日期,則也是如此。