我是 SQL 的新手,我对查询有疑问。
我有三张桌子:
- 具有字段 cons_id_no、key_id 的消费者
- bm_bill 具有字段 key_id、bill_id_no、amt_payable、bill_date(它将包含消费者的所有账单金额和日期)
- mreceipt 具有字段 key_id、receipt_no、amt_paid、fine、pay_date(它将包含消费者的所有付款详细信息)
消费者表与 bm_bill 和 mreceipt 是一对多的关系。我想根据消费者的 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
这是从 bm_bill 中检索所有 key_ids 和 bill_dates,我只需要特定 key_id 的信息。最重要的是,我的解决方案中还有一个这样的查询。
因此我的问题是:有没有更好的方法来做到这一点?