テーブルエイリアスを使用して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の1つのインデックス。
- set_reason_codesの場合、code_type、reason_codeの1つのインデックス
- 顧客の場合、customerkeyの1つのインデックス
あなたの問題の一部はここにあります。あなたはおそらくインデックスから利益を得るでしょう:
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);
次に、問題の核心にたどり着きます。あなたはcustomerテーブルに参加しますが、実際にそうする理由はないようです-が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