效率这么高吗?怎么可以改进?
我试图根据条件将一组列中的数据转换为两组列。我尝试的所有方法最终都有多行。
这与this other question非常相似,但有点复杂。
这是我做的: (因为这是针对iReport / JasperReports,使用多个查询将是一个很大的麻烦。)基本上我们想要从两张桌子上获得生活友好和非友好士兵的统计数据,用于军队战争游戏。
SELECT
army.army_key UNIT_NUM,
COUNT( case when soldier.type_id = 1 then 1 else NULL end ) AS friendCount,
SUM( case when soldier.type_id = 1 then soldier.achievement else 0 end ) AS friendAmount,
COUNT( case when soldier.type_id = 2 then 1 else NULL end ) AS enemyCount,
SUM( case when soldier.type_id = 2 then soldier.achievement else 0 end ) AS enemyAmount
FROM soldier, army
WHERE soldier.army_key = army.army_key
AND army.wargame_id = $P{GAME_ID}
AND soldier.dead is null
GROUP BY army.army_key
ORDER BY UNIT_NUM ASC
答案 0 :(得分:1)
对我来说很好看。没有笛卡尔积,也没有违反单值规则。
适用其他通用性能建议。从优化程序获取报告以确保正确使用索引。
考虑复合索引是否有帮助(例如军队:wargame_id
,army_key
)。
考虑覆盖索引(例如士兵:army_key
,dead
,type_id
,achievement
)。