我有三张桌子:
- 具有字段 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(最新),为此我创建了以下内容询问
我在这里提出了这个问题 ,我找到了一个解决方案,但这仍然不够,因为它正在从账单和付款表中检索整个数据。根据我从那里得到的提示,我已经找到了另一种解决方案,如下所示:
首先我创建了一个类型:
CREATE OR REPLACE TYPE key_id_row AS OBJECT
(
key_id number(10)
);
然后创建了一个表类型:
CREATE OR REPLACE TYPE key_id_tab AS TABLE OF key_id_row;
然后创建了一个函数:
CREATE OR REPLACE FUNCTION get_key_id(cons_id VARCHAR2) RETURN key_id_tab IS
result_tab key_id_tab;
BEGIN
SELECT
key_id_row(key_id)
BULK COLLECT INTO
result_tab
FROM
consumer
WHERE
cons_id_no = cons_id;
RETURN result_tab;
END get_key_id;
之后我在查询中使用它如下:
SELECT
c.key_id,
c.cons_id_no consumerid,
b.bill_id_no,
b.key_id,
b.bill_date,
m.key_id,
m.receipt_no,
m.pay_date
FROM
consumer c
LEFT OUTER JOIN
(
SELECT
bb.bill_id_no,
gk.key_id,
bb.bill_date,
ROW_NUMBER() OVER (PARTITION BY bb.key_id ORDER BY bb.bill_date DESC) AS rowNumber
FROM
bm_bill bb
JOIN
TABLE(get_key_id('2114109999')) gk
ON
(gk.key_id = bb.key_id)
) b
ON
(b.rowNumber = 1)
LEFT OUTER JOIN
(
SELECT
gk.key_id,
mr.receipt_no,
mr.pay_date,
ROW_NUMBER() OVER (PARTITION BY mr.key_id ORDER BY mr.pay_date DESC) rowNumber
FROM
mreceipt mr
JOIN
TABLE(get_key_id('2114109999')) gk
ON
(gk.key_id = mr.key_id)
) m
ON
(m.rowNumber = 1)
WHERE
c.cons_id_no='2114109999';
解决方案是否足够好,或者我是否必须通过以下方式解决问题:
从消费者表中选择 key_id 作为单独的查询,如下所示:
SELECT key_id FROM consumer WHERE cons_id_no = '2114109999';
并将其存储在一个变量中,并在我上面提到的查询中使用该值。