我正在尝试使用一些COUNT函数和GROUP BY子句来展平查询结果集。基本上,我有一个查询,可以返回十几行,基本上将作为一个对象处理。此外,导致此问题的列仅在处理结果集后才会相加,因此这似乎是聚合的理想时间。例如:
SELECT
A.ID, A.NAME, A.DETAILS,
COUNT(DISTINCT CASE WHEN B.TYPE = 'ONE' THEN B.ID2 END) AS B1
COUNT(DISTINCT CASE WHEN B.TYPE = 'TWO' THEN B.ID2 END) AS B2
COUNT(DISTINCT CASE WHEN B.TYPE = 'THREE'
AND B.SUBTYPE = 'ONE-ONE' THEN B.ID END) AS B3
FROM A
LEFT JOIN B ON B.A_ID = A.ID
GROUP BY A.ID, A.NAME, A.DETAILS
这个想法是计算各种类型/子类型的所有唯一关联B对象。问题是由于可能的查询的性质和数据库的结构方式(这是大大简化的。会有很多连接,子查询和一些参数,但这足以得到要点),我可能在A的每个实例上获得B.ID2的重复结果,这需要DISTINCT,否则它计算A的该值的所有B.ID2,并且得到不正确的结果。不幸的是,这导致超出第一个的每个聚合函数执行表扫描并在解释中创建TEMP表,并且没有任何索引似乎可以修复它。我不确定如果没有对查询本身造成更大性能问题的重大更改,我可以消除重复项。如果没有这个,我必须在我想要的每个类型/子类型上加入B,在select中包含B.ID2,然后在查询返回后对它们进行计数。这会严重影响结果集,我宁愿避免它。
这里是否有一个可行的替代方案,我缺少或者可能是一些索引那些可能会消除tablescan和TEMP表的列的方法?或者对此真的没有好的解决方案吗?