2011-01-03 8 views
2

は、私はこれらの3つのクエリがあります。これら3つのSQLクエリをOracleでどのように結合する必要がありますか?

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; 

しかし、私は実際には「巨大な」GROUP BY、それを行うための簡単な方法があることを好きではないのですか?

+1

あなたの個人的な好みによって「きちんとした」コードをプログラムするのは馬鹿です。あなたが言うとき、 "私は実際に"巨大な "グループを好きではありません。あなたはプロフェッショナルではないとは思えません。私はこれを何とか意味すると言っていません。まず、それはどの標準によっても巨大ではありません。それは非常に普通のサイズのグループです。第二に、それはそれです。あなたは次のことを行うクエリを書くべきです。 1.スケール。データベースアクティビティの拡張性が必要です。 2.維持可能。クエリは、構文と形式の標準を満たしている必要があります。 –

+1

UDFを削除することを強くお勧めします。 SQLの外観をきれいにするかもしれませんが、スケーラビリティとパフォーマンスが損なわれます。 Tom Kyteのルール1は、あなたができることができるSQLのすべてを行います...あなたがSQLでそれを行うことができないとき、PL/SQLでそれをします。ディレクターと作家がちょうど他のリレーショナル・テーブルであれば、それらすべてに参加してください。彼らがSOAコールなのなら、それを残しておいてください。 –

+0

私が意味することは、それは私には意味をなさないということです。より良い方法が必要です。私は、フィールドの束を選択しなければならない場合(私が使用できる*)、すべてをGROUP BYに入れなければならないという意味で、私には意味がありません。 Oracle SQLを使用していて、おそらく私が後にしていることを実行するためのより良い方法があるかもしれません。それがSOのためのものです、そうですか? –

答えて

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; 

あるいは

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; 
+0

ああ、スクラップ鉱山、私は最高の1つが好きです。 – MPelletier

+0

私は、3つのSQLクエリを呼び出すか、上記のように3つのSELECTを使用して1つのSQLクエリを実行することの意味と違いを理解できませんでした。 –

+0

@Nazgulled、3つの別々のデータベース呼び出しを意味しますか? – Ronnis

0

の方法について

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; 

または

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

私はいくつかのGroupByカラムを持っていることに問題がないと思います。これはSQLの非常に一般的なパターンです。もちろん、コードの明快さは、しばしば見る人の目の前にあります。

2つの方法の説明を確認してください。私の推測では、movie_ratingsテーブルを一度処理するだけで済むので、元のバージョンでより良いパフォーマンスを得ることができます。しかし、私はチェックしていない、それは多少のデータとインストールに依存するでしょう。