0

我正在尝试使用一些 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,在选择中包含 B.ID2,然后在查询返回后将它们计数。这将严重膨胀结果集,我宁愿避免它。

这里是否有我遗漏的可行替代方案,或者是否有某种方法可以索引那些可能消除 tablescan 和 TEMP 表的列?还是真的没有好的解决方案?

4

0 回答 0