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

Ric*_*ral 2 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(rating) FROM movie_ratings WHERE mid = 1;
Run Code Online (Sandbox Code Playgroud)

我需要将它们加入到单个查询中.我能够这样做:

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;
Run Code Online (Sandbox Code Playgroud)

但我真的不喜欢"巨大的"GROUP BY,有没有更简单的方法呢?

Ron*_*nis 5

你可以这样做:

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;
Run Code Online (Sandbox Code Playgroud)

甚至

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;
Run Code Online (Sandbox Code Playgroud)

  • 当查询数量加起来时,它具有可扩展性含义.10 ms的数据库调用在自己执行时看起来很快,但是执行1000次并且需要10秒.通常最好"减少"并在较少的调用中执行更大的操作(只要它不会混淆优化器).此外,调用PL/SQL函数(MovieGenres,MovieDirectors,MovieWriters)通常会导致基于行的处理,这对于像你这样的小查询来说效果很好(我认为mid在你的例子中是唯一的吗?),但是在外部查询中的行数增加. (2认同)