私はSQLの初心者であり、クエリについて疑問があります。
私は3つのテーブルを持っています:
- フィールドcons_id_no、key_idを持つコンシューマー
- key_id、bill_id_no、amt_payable、bill_dateの各フィールドを持つbm_bill(すべての請求額と消費者の日付が含まれます)
- key_id、receipt_no、amt_paid、fine、pay_dateのフィールドを持つmreceipt(消費者のすべての支払いの詳細が含まれます)
コンシューマーテーブルは、bm_billおよびmreceiptと1対多の関係があります。cons_id_noに基づいて消費者の元帳情報を作成したいと思います。これには、彼のcons_id_no、key_id、bill_id_no(最新)、bill_date(最新)、amt_payable(最新)、receipt_no(最新)、amt_paid(最新)、fine(最新)、pay_date(最新)が含まれている必要があります。クエリ
SELECT
c.key_id,
c.cons_id_no consumerid,
b.bill_id_no billno,
TO_CHAR(b.bill_date,'dd-Mon-YYYY') billdate,
b.amt_payable,
m.receipt_no receiptno,
TO_CHAR(m.pay_date,'dd-Mon-YYYY') paydate,
m.amt_paid+m.fine amountpaid
FROM
consumer c
LEFT OUTER JOIN (SELECT key_id, MAX(bill_date) AS maxDate FROM bm_bill GROUP BY key_id) maxBillDate
ON (maxBillDate.key_id = c.key_id)
LEFT OUTER JOIN bm_bill b
ON (b.key_id = c.key_id AND b.bill_date = maxBillDate.maxDate)
LEFT OUTER JOIN (SELECT key_id, MAX(pay_date) AS maxPayDate FROM mreceipt GROUP BY key_id) maxMReceipt
ON (maxMReceipt.key_id = c.key_id)
LEFT OUTER JOIN mreceipt m
ON (m.key_id = c.key_id AND m.pay_date = maxMReceipt.maxPayDate)
WHERE
c.cons_id_no='?';
クエリを実行すると、目的の結果が得られました。次に、クエリが遅すぎることに気づき、私のソリューションでは次のことがわかりました。
SELECT key_id, max(bill_date) AS maxDate FROM bm_bill GROUP BY key_id
これは、特定のkey_idの情報のみが必要なbm_billからすべてのkey_idsとbill_datesを取得しています。とりわけ、私のソリューションには、このようなクエリがもう1つあります。
したがって、私の質問は次のとおりです。これを行うためのより良い方法はありますか?