我应该如何在Oracle中加入这3个SQL查询?

我应该如何在Oracle中加入这3个SQL查询?,sql,oracle,join,Sql,Oracle,Join,我有以下3个问题: SELECT title, year, MovieGenres(m.mid) genres, MovieDirectors(m.mid) directors, MovieWriters(m.mid) writers, synopsis, poster_url FROM movies m WHERE m.mid = 1; SELECT AVG(rating) FROM movie_ratings WHERE mid = 1; SELECT COUNT(ratin

我有以下3个问题:

SELECT
  title, year, MovieGenres(m.mid) genres,
  MovieDirectors(m.mid) directors, MovieWriters(m.mid) writers,
  synopsis, poster_url
FROM movies m
WHERE m.mid = 1;

SELECT AVG(rating) FROM movie_ratings WHERE mid = 1;

SELECT COUNT(rating) FROM movie_ratings WHERE mid = 1;
我需要将它们合并到一个查询中。我可以这样做:

SELECT
  title, year, MovieGenres(m.mid) genres,
  MovieDirectors(m.mid) directors, MovieWriters(m.mid) writers,
  synopsis, poster_url, AVG(rating) average, COUNT(rating) count
FROM movies m INNER JOIN movie_ratings mr
  ON m.mid = mr.mid
WHERE m.mid = 1
GROUP BY
  title, year, MovieGenres(m.mid), MovieDirectors(m.mid),
  MovieWriters(m.mid), synopsis, poster_url;
SELECT title
      ,year
      ,MovieGenres(m.mid) genres
      ,MovieDirectors(m.mid) directors
      ,MovieWriters(m.mid) writers
      ,synopsis
      ,poster_url
      ,(select avg(mr.rating) 
         from movie_ratings mr 
        where mr.mid = m.mid) as avg_rating
      ,(select count(rating)  
         from movie_ratings mr 
        where mr.mid = m.mid) as num_ratings
  FROM movies m
 WHERE m.mid = 1;

但是我真的不喜欢“庞大”的群组,有没有更简单的方法呢?

你可以这样做:

SELECT
  title, year, MovieGenres(m.mid) genres,
  MovieDirectors(m.mid) directors, MovieWriters(m.mid) writers,
  synopsis, poster_url, AVG(rating) average, COUNT(rating) count
FROM movies m INNER JOIN movie_ratings mr
  ON m.mid = mr.mid
WHERE m.mid = 1
GROUP BY
  title, year, MovieGenres(m.mid), MovieDirectors(m.mid),
  MovieWriters(m.mid), synopsis, poster_url;
SELECT title
      ,year
      ,MovieGenres(m.mid) genres
      ,MovieDirectors(m.mid) directors
      ,MovieWriters(m.mid) writers
      ,synopsis
      ,poster_url
      ,(select avg(mr.rating) 
         from movie_ratings mr 
        where mr.mid = m.mid) as avg_rating
      ,(select count(rating)  
         from movie_ratings mr 
        where mr.mid = m.mid) as num_ratings
  FROM movies m
 WHERE m.mid = 1;
甚至

with grouped as(
   select avg(rating)   as avg_rating 
         ,count(rating) as num_ratings
     from movie_ratings 
    where mid = 1
)
select title
      ,year
      ,MovieGenres(m.mid) genres
      ,MovieDirectors(m.mid) directors
      ,MovieWriters(m.mid) writers
      ,synopsis
      ,poster_url
      ,avg_rating
      ,num_ratings
  from movies m cross join grouped
 where m.mid = 1;
怎么样

SELECT
  title, year, MovieGenres(m.mid) genres,
  MovieDirectors(m.mid) directors, MovieWriters(m.mid) writers,
  synopsis, poster_url,
  (SELECT AVG(rating) FROM movie_ratings WHERE mid = 1) av,
  (SELECT COUNT(rating) FROM movie_ratings WHERE mid = 1) cnt 
FROM movies m
WHERE m.mid = 1;


我想我不认为有几个GroupBy列有什么问题。这是SQL中非常常见的模式。当然,代码的清晰性往往是旁观者的眼中钉


检查两种方法的解释计划;我的猜测是,您的原始版本将获得更好的性能,因为它只需要处理电影评级表一次。但我还没有检查,这在某种程度上取决于数据和安装。

Ooh,废掉我的,我最喜欢那一个。我从未理解调用3个SQL查询或使用3个SELECT执行单个SQL查询之间的含义和区别…@Nazgulled,你的意思是3个独立的数据库调用吗?当查询的数量增加时,它会影响可伸缩性。一个10毫秒的数据库调用在自己执行时可能看起来很快,但是执行1000个数据库调用需要10秒钟。通常,最好是“放大”并在更少的调用中执行更大的操作(只要不会混淆优化器)。此外,对PL/SQL函数(电影类型、电影导演、电影编剧)的调用通常会导致基于行的处理,这对于像您这样的小查询很有效(我估计mid在您的示例中是唯一的?),但是当外部查询中的行数增加时,它的伸缩性不是很好。按照自己的个人喜好编写“整洁”代码是愚蠢的。当你说,“我真的不喜欢那个“庞大”的团队。”你听起来再专业不过了。我并不是说这有什么恶意。首先,以任何标准衡量,它都不算大。这是一个非常普通的群体。第二,它是什么。您应该编写执行以下操作的查询;1.规模数据库活动必须具有良好的伸缩性。2.可维护的。您的查询应该符合语法和格式的标准。我强烈建议您消除UDF。虽然它们可能会使SQL看起来更干净,但会破坏您的可伸缩性和性能。Tom Kyte的规则1是在SQL中尽一切可能。。。如果不能在SQL中执行,请在PL/SQL中执行。若director和writer只是其他关系表,那个么将它们全部连接起来。如果它们是SOA调用或类似的东西。。。那就离开他们。我的意思是,这对我来说毫无意义,必须有更好的办法。我的意思是,如果我必须选择一组字段,但不是所有字段(我可以使用*),我就必须将它们全部按分组,这对我来说没有意义,因为我只知道Oracle SQL的基础知识,也许有更好的方法来做我要做的事情,也许没有。这就是为什么,对吗?