0

サブクエリのカウント、または少なくともそれを回避する方法を取得しようとしています。

後で一時テーブルを作成するストアド プロシージャがありますが、その一時テーブルに返される行数が必要です。

一時テーブルを取得する方法は、いくつかの結合を持つ選択からです。その select ステートメントで返される行数を取得する方法はありますか?

私は次のようなものを持っています:

SELECT Book.Title,
       Book.Year,
       BookGenre.Genre
  FROM Book
  JOIN BookGenre ON Book.BookNum = BookGenre.BookNum
 WHERE Book.Title IS NOT NULL

その前に、そのクエリから返される行数を取得する必要があります。したがって、本質的に:

COUNT(SELECT Book.Title,
             Book.Year,
             BookGenre.Genre
        FROM Book
        JOIN BookGenre ON Book.BookNum = BookGenre.BookNum
       WHERE Book.Title IS NOT NULL)
4

1 に答える 1

3

@@RowCountの直後に、SELECT返された行数が表示されます。

カウントを取得してからクエリを繰り返すか、クエリを実行してカウントを取得できます。データをさらに処理する前にカウントを使用する必要がある場合は、クエリ結果を一時テーブルまたはテーブル変数に送信できます。

場合によっては、クエリを実行すると役立つことがありますが、後で完全なデータを取得するために必要な ID のみを保存してください。あなたの例は、それらのケースの1つではないようです。

完全を期すために:

非正規化も別の選択肢です。たとえば、トリガーを使用して、BookGenreテーブル内の各ジャンルの書籍数のカウントを維持できます。

クエリのコストが高く、繰り返し使用され、ある程度の古いデータを許容できる場合は、結果のキャッシュを維持することもできます。たとえば、Web サイトのホームページのトップ 10 リストは正確である必要はありません。通貨の錯覚を維持するには、5 分ごとにクエリを実行するだけで十分な場合があります。

時期尚早の最適化を避けるように注意してください。最適化を検討する前に、具体的かつ測定可能なパフォーマンスの問題を抱えている必要があります。

于 2013-06-12T19:47:23.653 に答える