所以我整晚都这样做 - 对我的作业不太了解,遗憾的是我的教授在周末没有。在这里:找到每个城市中显示的最新电影的标题。显示按城市名称和电影标题排序的城市名称和最新电影标题。
以下是我的表格声明(感谢今晚所有人帮助我,我欠你很多时间)。
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 :(得分: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)个电影具有相同的日期,也是如此。