SQL查询的后续帮助

时间:2010-09-12 00:26:53

标签: sql oracle ora-00937

我几天前问过类似的问题,这是我的问题。我的教授提出了以下问题:找出每个剧院播放的所有电影的平均评分。显示影院名称和计算的评级。按评级对结果进行排序。

以下是我的表格结构:

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 
 AVG(Movies.Rating), 
 Theatres.Name
 FROM Theatres
 JOIN ShownAt ON ShownAt.TheatreName = Theatres.Name
 JOIN Movies ON ShownAt.MovieTitle = Movies.Title
 ORDER BY Movies.Rating ASC

看到一些与众不同的东西?我一直收到一条错误,指出SQL错误:ORA-00937:不是单组组功能00937. 00000 - “不是单组组功能”。原谅我的初学者。

4 个答案:

答案 0 :(得分:4)

使用:

  SELECT AVG(m.rating) AS avg_rating, 
         t.name
    FROM THEATRES t
    JOIN SHOWNAT sa ON sa.theatrename = t.name
    JOIN MOVIES m ON m.title = sa.movietitle
GROUP BY t.name
ORDER BY avg_rating

GROUP BY必须包含聚合函数内未引用的所有列(IE:MAX,MIN,AVG,COUNT等)。

答案 1 :(得分:2)

您错过了GROUP BY

您不能将选择列表中的聚合表达式与非聚合列引用(在您的情况下为Theatres.Name)混合,除非您按这些非聚合列进行分组。

答案 2 :(得分:1)

当你在synax中有一个不合适的子句时,会出现“SQL命令未正确结束”,就像你在CREATE VIEW中没有ORDER BY一样。

所以,如果你没有SELECT AVG(COL1),COL2 FROM ........ GROUP BY COL2 ORDER by something 然后我不明白为什么你得到这个ORA例外。

粘贴生成该异常的最后一个查询,如果您在存储过程,函数或视图中使用它,也会告诉我。

答案 3 :(得分:1)

试试这个:

Select s.TheatreName Theatre, 
     Avg(m.rating) AvgRating  
From Movies m 
   left Join ShowAt s
     On s.movieTitle = m.Title
Group By s.TheatreName 
order By Avg(m.rating)

你不需要电影表,因为你不需要任何列