0

我有三张桌子:

  1. 具有字段 cons_id_no、key_id 的消费者
  2. bm_bill 具有字段 key_id、bill_id_no、amt_payable、bill_date(它将包含消费者的所有账单金额和日期)
  3. 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';

并将其存储在一个变量中,并在我上面提到的查询中使用该值。

4

1 回答 1

0

您的解决方案目前正在创建与每个消费者 ID 关联的 key_ids 表。如果您只需要最新的,那么您其他线程上的答案是正确的。由于您正在汇总账单和付款表中的最新值,因此在有序表上连接子查询是最好的方法。

我不确定从账单和付款表中检索整个数据是什么意思。如果您的意思是全表扫描,那么这应该通过适当的索引和/或分区来缓解。

您是否希望您的分类帐成为消费者所有账单和付款的完整清单?你的问题给人的印象是你只关心最新的。

于 2013-04-01T17:34:09.670 回答