我应该如何在Oracle中加入这3个SQL查询?
我有以下3个问题:我应该如何在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
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的基础知识,也许有更好的方法来做我要做的事情,也许没有。这就是为什么,对吗?