了解如何使用表别名使 SQL 可读:
SELECT r.description AS reason_code, COUNT(*) AS number_of_calls
FROM informix.contact_history AS h,
informix.set_reason_codes AS r,
informix.customers AS c
WHERE h.reason_code = r.reason_code
AND r.code_type = 'CONTACT_HISTORY'
AND h.customerkey = c.customerkey
AND h.call_type = 0
GROUP BY r.description
ORDER BY r.description
避免多余的括号也有帮助。您可以就布局进行辩论 - 但这些方面的内容通常看起来很合理。
改天,我们可以讨论使用用户“informix”作为表所有者的优点或缺点——我建议不要这样做,但有些人坚持认为这是他们的最佳选择。(我不同意他们的推理,但客户永远是对的。)
关于性能,您在评论中说索引是:
- 对于contact_history,customerkey、date_and_time 和reason_code 的一个索引。
- 对于 set_reason_codes,code_type 的一个索引,reason_code
- 对于客户,customerkey 的一个索引
您的部分问题出在此处。您可能会从索引中受益:
CREATE INDEX fk_contact_history ON contact_history(reason_code);
这将有助于加入' h.reason_code = r.reason_code
'; 现有的索引对此毫无用处。
您可能会从索引中受益:
CREATE INDEX ix_set_reason_codes ON set_reason_codes(reason_code);
然后我们进入问题的实质;您加入客户表,但似乎没有任何实际理由这样做 - 假设customerkey
实际上是customers
表的主键。
因此,您将从该查询中得到相同的结果:
SELECT r.description AS reason_code, COUNT(*) AS number_of_calls
FROM informix.contact_history AS h,
informix.set_reason_codes AS r
WHERE h.reason_code = r.reason_code
AND r.code_type = 'CONTACT_HISTORY'
AND h.call_type = 0
GROUP BY r.description
ORDER BY r.description