0

これらのテーブルGenreSongs. 1 つのジャンルが (明らかに) 多くの曲を持つことができ、1 つの曲が多くのジャンルに属する可能性があるため、それらの間には明らかに多対多の関係があります (xyz の曲があるとします。それはラップに属し、ヒップホップにも属します)。 )。このテーブルには、列GenreSongsが含まれているため、これら 2 つの間の多対多の関係マップとして機能します。したがって、私がこれを行うことになっているのは、このジャンルの曲の数が含まれるこの名前のテーブルに列を追加することです。テーブルを変更して列を追加したり、曲数を取得するクエリを作成したり、GenreIDSongIDGenreSongsCount

SELECT GenreID, Count(SongID) FROM GenreSongs GROUP BY GenreID

これで、必要なジャンルごとの曲数がわかりますが、このクエリを使用して、作成した列を更新するにはどうすればよいでしょうか ( SongsCount)。1 つの方法は、このクエリを実行して結果を確認し、その列を手動で更新することですが、それはプログラムによる方法ではないことに誰もが同意すると確信しています。外部クエリから値を取得し、内部クエリ(相関クエリ)からその値をカウントするサブクエリを使用してクエリを作成する必要があると思うようになりましたが、GenreID何も作成できません。誰でもこれを作るのを手伝ってもらえますか?

4

2 に答える 2

0

これにどのように取り組むかという問題は、データのサイズと更新の頻度によって異なります。ここにいくつかのシナリオがあります。

曲が頻繁に更新され、テーブルが非常に大きい場合は、ジャンルにカウントを含む列を作成し、曲テーブルのトリガーを使用して列を更新することをお勧めします。

または、GenreのGenreSongテーブルにインデックスを作成することもできます。次に、次のクエリ:

select count(*)
from GenreSong gs
where genre = <whatever>

かなり速く実行する必要があります。

曲が頻繁にまたはバッチで(たとえば、毎晩または毎週)更新される場合は、バッチの一部として曲数を更新できます。クエリは次のようになります。

update Genre
    set SongCnt = cnt
    from (select Genre, count(*) as cnt from GenreCount gc group by Genre) gc
    where Genre.genre = gc.Genre

さらに別の可能性は、値をまったく保存する必要がないことです。その場で計算を行うビュー/クエリの一部にすることができます。

リレーショナルデータベースは非常に柔軟性があり、多くの場合、物事を行う方法は複数あります。正しいアプローチは、達成しようとしていることに大きく依存します。

于 2012-06-03T20:50:51.527 に答える
0

SongsCount という名前のテーブルを作成するのは、明らかに悪い設計です (冗長なデータと更新のオーバーヘッド)。代わりに、単一の結果に対して次のクエリを使用します。

SELECT ID, ..., (SELECT Count(*) FROM GenreSongs WHERE GenreID = X) AS SongsCount FROM Genre WHERE ID = X

そして、これは複数の結果の場合です(はるかに効率的です):

SELECT ID, ..., SongsCount FROM (SELECT GenreID, Count(*) AS SongsCount FROM GenreSongs GROUP BY GenreID) AS sub RIGHT JOIN Genre AS g ON sub.GenreID = g.ID
于 2012-06-03T20:44:08.633 に答える