Oracle SQL Вопрос - PullRequest
       8

Oracle SQL Вопрос

2 голосов
/ 12 сентября 2010

Так что я занимаюсь этим всю ночь - не могу понять мою домашнюю работу, и, к сожалению, мой профессор недоступен в выходные дни.Вот и все: найдите названия новейших фильмов, показанных в каждом городе.Отобразите название города и название самого нового фильма, упорядоченные по названию города и названию фильма.

Вот моя таблица, которую я объявляю (и спасибо ВСЕМ, кто выручил меня сегодня вечером, я должен вам большое время).

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 ]

4 голосов
/ 12 сентября 2010

Вопрос действительно плохой, потому что единственный способ узнать, что является «самым новым», - это значение 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

... чтобы получить тройку самых последних выпущенных фильмов. Изменить в соответствии с вашими потребностями.

1 голос
/ 12 сентября 2010

вы будете использовать функцию агрегирования MAX, чтобы найти наибольшее значение releaseDate для каждого показанного фильма.

Для MAX потребуется предложение GROUP BY, в котором вы говорите, какой набор использовать для нахождения максимальных значений.

0 голосов
/ 12 сентября 2010

«OVER PARTITION BY» не работает, если два фильма имеют один и тот же самый новый релиз, потому что будет возвращен только один из них. То же самое происходит, если (n + 1) фильмы имеют одинаковую дату, когда используется «WHERE x.rank <= n». </p>

0 голосов
/ 12 сентября 2010

Внутренний выбор, чтобы получить последнее шоу для каждого города, внешний выбор, чтобы получить все фильмы, которые соответствуют.

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 голосов
/ 12 сентября 2010
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 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...