0

私は大規模なデータベースを持っており、各クエリは他の計算の中でいくつかのカウントを行うため、特定のクエリが結果を返すのに約7秒かかります。それをスピードアップするために、これらのカウントがすでに計算されて保存されている新しいルックアップテーブルを作成したいと思います。

テーブルを埋めるプログラムを簡単に作成できることは知っていますが、外部処理なしで同じ結果セットを生成する方法があるかどうかを知りたいです。

たとえば、次の結果セットを考えてみましょう。

SELECT DISTINCT city, state FROM lkp_city_state AS locations;

さて、これらの都市/州の組み合わせのそれぞれについて、それらの中のフェラリスとランボルギーニの数を数えたいと思います。の線に沿った何か

SELECT COUNT(*) as num_ferarris FROM cars WHERE manufacturer = 'ferarri' AND city = locations.city AND state = locations.state
    JOIN
SELECT COUNT(*) as num_lambos FROM cars WHERE manufacturer = 'lamborghini' AND city = locations.city AND state = locations.state`

理想的な結果セットの列は次のようになります。

city | state | num_ferarris | num_lambos

これは可能ですか?

4

2 に答える 2

0

1つのクエリでリストに直接参加できます

SELECT 
      locations.city,
      locations.state,
      cars.manufacturer,
      COUNT(*)
   FROM cars 
      JOIN lkp_city_state AS locations;
         on cars.city = locations.city
        and cars.state = locations.state
   WHERE 
         cars.manufacturer = 'ferarri' 
      OR cars.manufacturer = 'lamborghini'
   GROUP BY
      locations.city,
      locations.state,
      cars.manufacturer

単一の行にしたい場合は、結果をピボットできます

SELECT 
      locations.city,
      locations.state,
      sum( case when cars.manufacturer = 'ferarri' then 1 else 0 end ) as Num_Ferarri,
      sum( case when cars.manufacturer = 'lamborghini' then 1 else 0 end ) as Num_Lambos
   FROM cars 
      JOIN lkp_city_state AS locations;
         on cars.city = locations.city
        and cars.state = locations.state
   WHERE 
         cars.manufacturer = 'ferarri' 
      OR cars.manufacturer = 'lamborghini';
       GROUP BY
          locations.city,
          locations.state,
于 2013-03-06T22:44:15.907 に答える
0

まず、の使用を検討してindexesください。私は過去にそれらを使用しませんでしたが、最近、クエリを高速化するためにそれらが信じられないほど良い仕事をしていることを確認しました。

第二に、私はこのようなものがうまくいくと思います:

SELECT * FROM
(    SELECT 
      c.city, c.state, COUNT(*) as num_lambo
    FROM cars AS c
    LEFT JOIN locations
      ON  locations.city = c.city AND locations.state = c.state
    WHERE manufacturer = 'lambo' )A

JOIN

(    SELECT 
      c.city, c.state, COUNT(*) as num_ferr
    FROM cars AS c
    LEFT JOIN locations
      ON  locations.city = c.city AND locations.state = c.state
    WHERE manufacturer = 'ferrari' )B

SQLフィドルテスト

于 2013-03-06T22:50:03.090 に答える