Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Firebird SQL:由于合并,查询速度较慢,或者可以重写查询_Sql_Firebird_Coalesce - Fatal编程技术网

Firebird SQL:由于合并,查询速度较慢,或者可以重写查询

Firebird SQL:由于合并,查询速度较慢,或者可以重写查询,sql,firebird,coalesce,Sql,Firebird,Coalesce,我对一个常用的查询有一些性能问题 SELECT v.id, coalesce((SELECT sum(amount) FROM artjournal WHERE variant_ref=v.id AND storage_ref=1 AND atype_ref in (1,3,4)), 0) "fv", coalesce((SELECT sum(amount) FROM artjournal WHERE variant_ref=v.id AND storage_ref=1 AND atype_r

我对一个常用的查询有一些性能问题

SELECT
v.id,
coalesce((SELECT sum(amount) FROM artjournal WHERE variant_ref=v.id AND storage_ref=1 AND atype_ref in (1,3,4)), 0) "fv", 
coalesce((SELECT sum(amount) FROM artjournal WHERE variant_ref=v.id AND storage_ref=1 AND atype_ref=2), 0) "ivo", 
coalesce((SELECT sum(amount) FROM artjournal WHERE variant_ref=v.id AND storage_ref=1 AND atype_ref=5), 0) "iio", 
coalesce((SELECT sum(amount * mvalue) FROM artjournal WHERE variant_ref=v.id AND storage_ref=1), 0) "vw"
FROM productvariant v
由于artjournal是一个大表,每天都有数千条新记录,因此性能变得非常糟糕

我在所有ID字段上都有索引

有没有办法重写这句话来加快速度?或者我可以使用不同的方法从artjournal表检索数据,如果结果为null,则返回0吗

谢谢你的想法


Christiaan

看起来您需要一个经过筛选的聚合:

SELECT v.id,
       sum(case when a.atype_ref in (1,3,4) then a.amount else 0 end) as "fv",
       sum(case when a.atype_ref = 2 then a.amount else 0 end) as "ivo",
       sum(case when a.atype_ref = 5 then a.amount else 0 end) as "iio",
       sum(a.amount * a.mvalue) as "vw"
FROM productvariant v
  LEFT JOIN artjournal a ON a.variant_ref = v.id
WHERE storage_ref = 1
GROUP BY v.id;

仍然缺少
coalesce
s,因为如果设置为
sum
的记录为
NULL
,则结果也是如此。