-2

次のクエリを作成しました。

SELECT GVA14.COD_ZONA, Sum(GVA12.IMPORTE) AS SumOfIMPORTE
FROM GVA14 LEFT JOIN GVA12 
  ON GVA14.COD_CLIENT = GVA12.COD_CLIENT
WHERE Month(GVA12.FECHA_EMIS)=Month(curdate())
AND Year(GVA12.FECHA_EMIS)=Year(curdate())
GROUP BY GVA14.COD_ZONA;

COD_ZONAしかし、私が表示したい他の値があります。月と年のフィルターを削除すると、これらが表示されます。これは、興味のある人のためのSQLフィドルです。http://sqlfiddle.com/#!2/3aae1/3


編集1#

私は今、次のクエリを持っています:

SELECT GVA14.COD_ZONA, Coalesce(Sum(GVA12.IMPORTE), 0) AS SumOfIMPORTE
FROM GVA14 
LEFT JOIN GVA12 
  ON GVA14.COD_CLIENT = GVA12.COD_CLIENT
  AND Month(GVA12.FECHA_EMIS)=Month(curdate())
  AND Year(GVA12.FECHA_EMIS)=Year(curdate())
GROUP BY GVA14.COD_ZONA;

しかし、それを実行しようとすると、約110秒かかり、その前に必要なプログラムがタイムアウトします。@Bluefeetの提案に基づいてインデックスを作成し、それをゾーンと呼び、GVA14.COD_ZONAを含めました。

次に何をしますか?

4

3 に答える 3

2

WHERE句のフィルターをJOIN条件に移動します。WHERE句にフィルターを残しておくと、クエリは:INNER JOINではなくのように機能します。LEFT JOIN

SELECT GVA14.COD_ZONA, Coalesce(Sum(GVA12.IMPORTE), 0) AS SumOfIMPORTE
FROM GVA14 
LEFT JOIN GVA12 
  ON GVA14.COD_CLIENT = GVA12.COD_CLIENT
  AND Month(GVA12.FECHA_EMIS)=Month(curdate())
  AND Year(GVA12.FECHA_EMIS)=Year(curdate())
GROUP BY GVA14.COD_ZONA;

SQL FiddlewithDemoを参照してください

結果:

| COD_ZONA | SUMOFIMPORTE |
---------------------------
|       01 |         3000 |
|       02 |         1000 |
|       03 |            0 |
于 2013-01-08T10:28:24.997 に答える
1

テーブルに4つのインデックスを追加することでこれを修正しました(多すぎるかどうかはわかりません!)。機能した...

于 2013-01-08T14:07:00.207 に答える
0
    SELECT GVA14.COD_ZONA
         , COALESCE(Sum(GVA12.IMPORTE),0) AS SumOfIMPORTE
      FROM GVA14 
      LEFT 
      JOIN GVA12 
        ON GVA14.COD_CLIENT = GVA12.COD_CLIENT
       AND Month(GVA12.FECHA_EMIS)=Month(curdate())
       AND Year(GVA12.FECHA_EMIS)=Year(curdate())
     GROUP 
        BY GVA14.COD_ZONA;
于 2013-01-08T10:26:18.267 に答える