Oracle SQL问题

时间:2010-09-12 03:05:50

标签: sql oracle

所以我整晚都这样做 - 对我的作业不太了解,遗憾的是我的教授在周末没有。在这里:找到每个城市中显示的最新电影的标题。显示按城市名称和电影标题排序的城市名称和最新电影标题。

以下是我的表格声明(感谢今晚所有人帮助我,我欠你很多时间)。

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

显然我的问题在于宣布最新的电影 - 我怎么能解释这个?我通过实例学习 - 一旦某人向我展示了一种方式,我就可以将其应用到其他所有方面 - 请帮助。

5 个答案:

答案 0 :(得分:4)

问题非常糟糕,因为了解“最新”的唯一方法是MOVIE.releasedate值,这对所有城市都是一样的,因为发布日期应该存储在{每个城市组合的{1}}表格电影。

这将列出数据库中的所有电影,最上面的电影:

SHOWNAT

要获得最新的电影,我会使用分析函数(支持8i +,但可能超出了您的课程范围):

  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

要获得超过最顶层的电影,请将 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

...获得最近发布的三部电影。根据您的需求进行更改。

答案 1 :(得分:1)

您将使用MAX聚合函数查找显示的每部电影的最大releaseDate值。

MAX将需要一个GROUP BY子句,您可以在其中说明在找到最大值时使用哪个集合。

答案 2 :(得分: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 

答案 3 :(得分: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
);

答案 4 :(得分:0)

'OVER PARTITION BY'如果两部电影具有相同的最新发布,则不起作用,因为只返回其中一部。如果使用'WHERE x.rank< = n'时(n + 1)个电影具有相同的日期,也是如此。