2010-09-11 48 views
1

以下是教授提出的问题:查找每个城市播放电影的最小和最大长度。需要某些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) 
); 

我已经尝试了几种不同的查询,但不断收到的问题。这里是我的:

SELECT MIN(Movies.Length), MAX(Movies.Length), Theatres.Name 
FROM Theatres, Movies, ShownAt 
WHERE ShownAt.TheatreName = Theatres.Name AND 
ShownAt.MovieTitle = Movies.Title AND 
Theatres.City IN (SELECT UNIQUE City FROM Theatres); 

有人看到有什么不对吗?谢谢您的帮助!

+0

你可能想解释查询的意思,但你要么需要ORDER BY ASC或ORDER BY DESC或MIN() ,MAX()在您的查询中起作用。 – 2010-09-12 00:01:22

回答

2

你觉得我很亲密。只是缺少GROUP BY

SELECT 
    MIN(Movies.Length) AS Shortest, 
    MAX(Movies.Length) AS Longest, 
    Theatres.City 
FROM Theatres 
JOIN ShownAt ON ShownAt.TheatreName = Theatres.Name 
JOIN Movies ON ShownAt.MovieTitle = Movies.Title 
GROUP BY Theatres.City 
1

我相信这会做的伎俩:

SELECT T.City, MIN(M.Length) AS MinLength, MAX(M.Length) AS MaxLength 
    FROM Movies AS M 
    JOIN ShownAt AS S ON S.MovieTitle = M.Title 
    JOIN Theatres AS T ON S.TheatreName = T.Name 
GROUP BY T.City